From 68f521b2d9206d5d3baa47d8aa82fb31362397eb Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Tue, 18 Mar 2014 15:24:18 -0400 Subject: [PATCH] new kinect for Processing repo --- .gitignore | 3 + .../KinectJNI.xcodeproj/daniel.mode1v3 | 1455 +++++++++++++++++ .../KinectJNI.xcodeproj/daniel.pbxuser | 882 ++++++++++ .../KinectJNI.xcodeproj/default.pbxuser | 151 ++ .../KinectJNI.xcodeproj/itpstudent.mode1v3 | 1392 ++++++++++++++++ .../KinectJNI.xcodeproj/itpstudent.pbxuser | 180 ++ .../KinectJNI.xcodeproj/project.pbxproj | 799 +++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/KinectJNI.xccheckout | 41 + .../UserInterfaceState.xcuserstate | Bin 0 -> 18908 bytes .../WorkspaceSettings.xcsettings | 10 + .../xcschemes/Assemble Application.xcscheme | 86 + .../xcschemes/Compile Java.xcscheme | 59 + .../xcschemes/Compile Native.xcscheme | 59 + .../xcschemes/KinectJNI.xcscheme | 59 + .../xcschemes/xcschememanagement.plist | 52 + KinectJNI_v0002/lib/eawt-stubs.jar | Bin 0 -> 4189 bytes KinectJNI_v0002/make/build.xml | 87 + KinectJNI_v0002/make/find-classrefs.sh | 31 + .../resources/English.lproj/Credits.rtf | 29 + .../resources/English.lproj/InfoPlist.strings | Bin 0 -> 174 bytes KinectJNI_v0002/resources/Info.plist | 40 + KinectJNI_v0002/resources/Manifest | 1 + KinectJNI_v0002/src/Example.java | 214 +++ .../src/java/shiffman/kinect/KinectJNI.java | 39 + .../shiffman/kinect/NativeAddressBook.java | 36 + .../java/shiffman/kinect/NativeKinect.java | 35 + KinectJNI_v0002/src/libfreenect/cameras.c | 786 +++++++++ KinectJNI_v0002/src/libfreenect/core.c | 197 +++ .../src/libfreenect/freenect_internal.h | 156 ++ KinectJNI_v0002/src/libfreenect/libfreenect.h | 164 ++ .../src/libfreenect/libfreenect.hpp | 155 ++ .../src/libfreenect/libfreenect.pc.in | 11 + KinectJNI_v0002/src/libfreenect/tilt.c | 103 ++ .../src/libfreenect/usb_libusb10.c | 261 +++ .../src/libfreenect/usb_libusb10.h | 93 ++ .../libusb/osx/include/libusb-1.0/libusb.h | 1322 +++++++++++++++ .../src/libusb/osx/libs/libusb-1.0.a | Bin 0 -> 118752 bytes KinectJNI_v0002/src/libusb/osx/libs/usb-1.0.a | Bin 0 -> 163136 bytes .../src/native/NativeAddressBook.h | 9 + .../src/native/NativeAddressBook.m | 16 + KinectJNI_v0002/src/native/NativeKinect.cpp | 19 + KinectJNI_v0002/src/native/NativeKinect.h | 10 + .../native-1.moved-aside/NativeKinect.h | 9 + .../src/native/org_openkinect_Context.cpp | 199 +++ .../src/native/org_openkinect_Context.h | 61 + .../src/native/org_openkinect_Device.cpp | 102 ++ .../src/native/org_openkinect_Device.h | 85 + .../src/org/openkinect/Acceleration.java | 35 + .../src/org/openkinect/ColorFormat.java | 36 + .../src/org/openkinect/Context.java | 148 ++ .../src/org/openkinect/DepthFormat.java | 38 + .../src/org/openkinect/Device.java | 185 +++ KinectJNI_v0002/src/org/openkinect/Image.java | 37 + .../src/org/openkinect/LEDStatus.java | 41 + .../src/org/openkinect/LogLevel.java | 42 + .../src/org/openkinect/Logger.java | 35 + OpenKinect-Processing/.classpath | 12 + OpenKinect-Processing/.gitignore | 1 + OpenKinect-Processing/.project | 17 + .../data/kinectThreshold.txt | 1 + .../AveragePointTracking.pde | 65 + .../AveragePointTracking/KinectTracker.pde | 125 ++ .../DepthThreshold/DepthThreshold.pde | 79 + .../examples/PointCloud/PointCloud.pde | 104 ++ .../examples/RGBDepthTest/RGBDepthTest.pde | 68 + OpenKinect-Processing/lib/libKinect.jnilib | Bin 0 -> 75268 bytes OpenKinect-Processing/lib/openkinect.jar | Bin 0 -> 13675 bytes .../resources/build.properties | 172 ++ OpenKinect-Processing/resources/build.xml | 386 +++++ .../resources/code/ExampleTaglet.java | 231 +++ .../resources/code/ant-contrib-1.0b3.jar | Bin 0 -> 224277 bytes OpenKinect-Processing/resources/code/doc.sh | 18 + .../resources/install_instructions.txt | 46 + .../resources/library.properties | 40 + .../resources/stylesheet.css | 310 ++++ .../src/org/openkinect/Acceleration.java | 35 + .../src/org/openkinect/ColorFormat.java | 38 + .../src/org/openkinect/Context.java | 148 ++ .../src/org/openkinect/DepthFormat.java | 38 + .../src/org/openkinect/Device.java | 200 +++ .../src/org/openkinect/Image.java | 37 + .../src/org/openkinect/LEDStatus.java | 41 + .../src/org/openkinect/LogLevel.java | 42 + .../src/org/openkinect/Logger.java | 35 + .../org/openkinect/processing/DepthImage.java | 142 ++ .../src/org/openkinect/processing/Kinect.java | 156 ++ .../org/openkinect/processing/RGBImage.java | 68 + .../processing/tests/FancyDepthImage.java | 122 ++ .../processing/tests/KinectTracker.java | 141 ++ .../processing/tests/KinectTrackingTest.java | 79 + .../processing/tests/Kinecting.java | 74 + .../processing/tests/PointCloud.java | 121 ++ OpenKinect-Processing/web/index.html | 137 ++ OpenKinect-Processing/web/stylesheet.css | 203 +++ README.md | 3 + 96 files changed, 13637 insertions(+) create mode 100644 .gitignore create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/daniel.mode1v3 create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/daniel.pbxuser create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/default.pbxuser create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.mode1v3 create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.pbxuser create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/project.pbxproj create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcshareddata/KinectJNI.xccheckout create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcuserdata/jespera.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcuserdata/jespera.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Assemble Application.xcscheme create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Java.xcscheme create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Native.xcscheme create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/KinectJNI.xcscheme create mode 100644 KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 KinectJNI_v0002/lib/eawt-stubs.jar create mode 100644 KinectJNI_v0002/make/build.xml create mode 100755 KinectJNI_v0002/make/find-classrefs.sh create mode 100644 KinectJNI_v0002/resources/English.lproj/Credits.rtf create mode 100644 KinectJNI_v0002/resources/English.lproj/InfoPlist.strings create mode 100644 KinectJNI_v0002/resources/Info.plist create mode 100644 KinectJNI_v0002/resources/Manifest create mode 100644 KinectJNI_v0002/src/Example.java create mode 100644 KinectJNI_v0002/src/java/shiffman/kinect/KinectJNI.java create mode 100644 KinectJNI_v0002/src/java/shiffman/kinect/NativeAddressBook.java create mode 100644 KinectJNI_v0002/src/java/shiffman/kinect/NativeKinect.java create mode 100644 KinectJNI_v0002/src/libfreenect/cameras.c create mode 100644 KinectJNI_v0002/src/libfreenect/core.c create mode 100644 KinectJNI_v0002/src/libfreenect/freenect_internal.h create mode 100644 KinectJNI_v0002/src/libfreenect/libfreenect.h create mode 100644 KinectJNI_v0002/src/libfreenect/libfreenect.hpp create mode 100644 KinectJNI_v0002/src/libfreenect/libfreenect.pc.in create mode 100644 KinectJNI_v0002/src/libfreenect/tilt.c create mode 100644 KinectJNI_v0002/src/libfreenect/usb_libusb10.c create mode 100644 KinectJNI_v0002/src/libfreenect/usb_libusb10.h create mode 100644 KinectJNI_v0002/src/libusb/osx/include/libusb-1.0/libusb.h create mode 100644 KinectJNI_v0002/src/libusb/osx/libs/libusb-1.0.a create mode 100644 KinectJNI_v0002/src/libusb/osx/libs/usb-1.0.a create mode 100644 KinectJNI_v0002/src/native/NativeAddressBook.h create mode 100644 KinectJNI_v0002/src/native/NativeAddressBook.m create mode 100644 KinectJNI_v0002/src/native/NativeKinect.cpp create mode 100644 KinectJNI_v0002/src/native/NativeKinect.h create mode 100644 KinectJNI_v0002/src/native/native-1.moved-aside/NativeKinect.h create mode 100644 KinectJNI_v0002/src/native/org_openkinect_Context.cpp create mode 100644 KinectJNI_v0002/src/native/org_openkinect_Context.h create mode 100644 KinectJNI_v0002/src/native/org_openkinect_Device.cpp create mode 100644 KinectJNI_v0002/src/native/org_openkinect_Device.h create mode 100644 KinectJNI_v0002/src/org/openkinect/Acceleration.java create mode 100644 KinectJNI_v0002/src/org/openkinect/ColorFormat.java create mode 100644 KinectJNI_v0002/src/org/openkinect/Context.java create mode 100644 KinectJNI_v0002/src/org/openkinect/DepthFormat.java create mode 100644 KinectJNI_v0002/src/org/openkinect/Device.java create mode 100644 KinectJNI_v0002/src/org/openkinect/Image.java create mode 100644 KinectJNI_v0002/src/org/openkinect/LEDStatus.java create mode 100644 KinectJNI_v0002/src/org/openkinect/LogLevel.java create mode 100644 KinectJNI_v0002/src/org/openkinect/Logger.java create mode 100755 OpenKinect-Processing/.classpath create mode 100755 OpenKinect-Processing/.gitignore create mode 100755 OpenKinect-Processing/.project create mode 100644 OpenKinect-Processing/data/kinectThreshold.txt create mode 100644 OpenKinect-Processing/examples/AveragePointTracking/AveragePointTracking.pde create mode 100644 OpenKinect-Processing/examples/AveragePointTracking/KinectTracker.pde create mode 100644 OpenKinect-Processing/examples/DepthThreshold/DepthThreshold.pde create mode 100644 OpenKinect-Processing/examples/PointCloud/PointCloud.pde create mode 100644 OpenKinect-Processing/examples/RGBDepthTest/RGBDepthTest.pde create mode 100755 OpenKinect-Processing/lib/libKinect.jnilib create mode 100644 OpenKinect-Processing/lib/openkinect.jar create mode 100755 OpenKinect-Processing/resources/build.properties create mode 100755 OpenKinect-Processing/resources/build.xml create mode 100755 OpenKinect-Processing/resources/code/ExampleTaglet.java create mode 100755 OpenKinect-Processing/resources/code/ant-contrib-1.0b3.jar create mode 100755 OpenKinect-Processing/resources/code/doc.sh create mode 100755 OpenKinect-Processing/resources/install_instructions.txt create mode 100755 OpenKinect-Processing/resources/library.properties create mode 100755 OpenKinect-Processing/resources/stylesheet.css create mode 100644 OpenKinect-Processing/src/org/openkinect/Acceleration.java create mode 100644 OpenKinect-Processing/src/org/openkinect/ColorFormat.java create mode 100644 OpenKinect-Processing/src/org/openkinect/Context.java create mode 100644 OpenKinect-Processing/src/org/openkinect/DepthFormat.java create mode 100644 OpenKinect-Processing/src/org/openkinect/Device.java create mode 100644 OpenKinect-Processing/src/org/openkinect/Image.java create mode 100644 OpenKinect-Processing/src/org/openkinect/LEDStatus.java create mode 100644 OpenKinect-Processing/src/org/openkinect/LogLevel.java create mode 100644 OpenKinect-Processing/src/org/openkinect/Logger.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/DepthImage.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/Kinect.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/RGBImage.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/tests/FancyDepthImage.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/tests/KinectTracker.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/tests/KinectTrackingTest.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/tests/Kinecting.java create mode 100644 OpenKinect-Processing/src/org/openkinect/processing/tests/PointCloud.java create mode 100755 OpenKinect-Processing/web/index.html create mode 100755 OpenKinect-Processing/web/stylesheet.css create mode 100755 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5228a71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.class +distribution +*.DS_Store diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/daniel.mode1v3 b/KinectJNI_v0002/KinectJNI.xcodeproj/daniel.mode1v3 new file mode 100644 index 0000000..c6063d7 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/daniel.mode1v3 @@ -0,0 +1,1455 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCProjectFormatConflictsModule + Name + Project Format Conflicts List + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + BundleLoadPath + + MaxInstances + n + Module + XCSnapshotModule + Name + Snapshots Tool + + + BundlePath + /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1v3 + FavBarConfig + + PBXProjectModuleGUID + 6598C50D129066C8009C53C6 + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1v3 + MajorVersion + 33 + MinorVersion + 0 + Name + Default + Notifications + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + active-combo-popup + action + NSToolbarFlexibleSpaceItem + debugger-enable-breakpoints + build-and-go + com.apple.ide.PBXToolbarStopButton + get-info + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 291 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 89D0F0260F392F48007831A7 + 6564A70912B9B6DF0003A8AC + 6564A70A12B9B6DF0003A8AC + 6564A70B12B9B6DF0003A8AC + 6564A70C12B9B6DF0003A8AC + 6564A70E12B9B6DF0003A8AC + 6598C511129067A9009C53C6 + 6564A7D012B9BD040003A8AC + 6564A7D112B9BD040003A8AC + 65D35FC6129076F30032D2A2 + 65D35FC7129076F80032D2A2 + 89D0F0200F392F20007831A7 + 89D0F1390F3948A9007831A7 + 29B97323FDCFA39411CA2CEA + 1058C7A0FEA54F0111CA2CBB + 1058C7A2FEA54F0111CA2CBB + 19C28FACFE9D520D11CA2CBB + 1C37FBAC04509CD000000102 + 6564A7F912BA4AED0003A8AC + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 11 + 10 + 1 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {291, 706}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {308, 724}} + GroupTreeTableConfiguration + + MainColumn + 291 + + RubberWindowFrame + 0 113 1440 765 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 308pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + Example.java + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + Example.java + _historyCapacity + 0 + bookmark + 6564A80E12BA4AED0003A8AC + history + + 65415BC31290A99F00F30EBD + 65415D011290AED400F30EBD + 65415E281290B75800F30EBD + 65415E2A1290B75800F30EBD + 65415EAD1290D5D400F30EBD + 65415EAE1290D5D400F30EBD + 65C5B8931290E43200E79FA5 + 6564A6BC12B9B5D50003A8AC + 6564A6C512B9B5FD0003A8AC + 6564A71E12B9B7080003A8AC + 6564A72112B9B7080003A8AC + 6564A77312B9B8B90003A8AC + 6564A7A612B9BAF80003A8AC + 6564A7C312B9BCBE0003A8AC + 6564A7C412B9BCBE0003A8AC + 6564A7C512B9BCBE0003A8AC + 6564A7C612B9BCBE0003A8AC + 6564A7C712B9BCBE0003A8AC + 6564A7E612B9BDF20003A8AC + 6564A7FA12BA4AED0003A8AC + 6564A7FB12BA4AED0003A8AC + 6564A7FC12BA4AED0003A8AC + 6564A7FE12BA4AED0003A8AC + 6564A7FF12BA4AED0003A8AC + 6564A80012BA4AED0003A8AC + 6564A80112BA4AED0003A8AC + 6564A80212BA4AED0003A8AC + 6564A80312BA4AED0003A8AC + 6564A80412BA4AED0003A8AC + 6564A80512BA4AED0003A8AC + 6564A80612BA4AED0003A8AC + 6564A80712BA4AED0003A8AC + 6564A80812BA4AED0003A8AC + 6564A80912BA4AED0003A8AC + 6564A80B12BA4AED0003A8AC + 6564A80C12BA4AED0003A8AC + 6564A80D12BA4AED0003A8AC + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1127, 651}} + RubberWindowFrame + 0 113 1440 765 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 651pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 656}, {1127, 68}} + RubberWindowFrame + 0 113 1440 765 0 0 1440 878 + + Module + XCDetailModule + Proportion + 68pt + + + Proportion + 1127pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + 6564A72412B9B7080003A8AC + 1CE0B1FE06471DED0097A5F4 + 6564A72512B9B7080003A8AC + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfigUserDefaultsMinorVersion + 2 + ToolbarConfiguration + xcode.toolbar.config.defaultV3 + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + 0 + Layout + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 337}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 1 + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 355}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 373 269 690 397 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 100% + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.shortV3 + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 0.0 + ToolbarConfigUserDefaultsMinorVersion + 2 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + 6564A72612B9B7080003A8AC + 6564A72712B9B7080003A8AC + 1C78EAAD065D492600B07095 + 1CD10A99069EF8BA00B06720 + 6598C50E129066C8009C53C6 + /Users/daniel/Dropbox/kinect/KinectJNI_v0002/KinectJNI.xcodeproj + + WindowString + 0 113 1440 765 0 0 1440 878 + WindowToolsV3 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + NativeKinect.cpp + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1440, 635}} + RubberWindowFrame + 0 114 1440 764 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 635pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build Results + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1011 + + GeometryConfiguration + + Frame + {{0, 640}, {1440, 83}} + RubberWindowFrame + 0 114 1440 764 0 0 1440 878 + + Module + PBXBuildResultsModule + Proportion + 83pt + + + Proportion + 723pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + 6598C50E129066C8009C53C6 + 6564A6D412B9B6740003A8AC + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.buildV3 + WindowContentMinSize + 486 300 + WindowString + 0 114 1440 764 0 0 1440 878 + WindowToolGUID + 6598C50E129066C8009C53C6 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {316, 203}} + {{316, 0}, {378, 203}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {694, 203}} + {{0, 203}, {694, 178}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {694, 381}} + PBXDebugSessionStackFrameViewKey + + DebugVariablesTableConfiguration + + Name + 120 + Value + 85 + Summary + 148 + + Frame + {{316, 0}, {378, 203}} + RubberWindowFrame + 148 337 694 422 0 0 1440 878 + + RubberWindowFrame + 148 337 694 422 0 0 1440 878 + + Module + PBXDebugSessionModule + Proportion + 381pt + + + Proportion + 381pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + 6564A6D512B9B6740003A8AC + 1C162984064C10D400B95A72 + 6564A6D612B9B6740003A8AC + 6564A6D712B9B6740003A8AC + 6564A6D812B9B6740003A8AC + 6564A6D912B9B6740003A8AC + 6564A6DA12B9B6740003A8AC + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + WindowString + 148 337 694 422 0 0 1440 878 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {1006, 495}} + RubberWindowFrame + 159 256 1006 536 0 0 1440 878 + + Module + PBXDebugCLIModule + Proportion + 495pt + + + Proportion + 495pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + 1C78EAAD065D492600B07095 + 6564A6DB12B9B6740003A8AC + 1C78EAAC065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.consoleV3 + WindowString + 159 256 1006 536 0 0 1440 878 + WindowToolGUID + 1C78EAAD065D492600B07095 + WindowToolIsVisible + + + + Identifier + windowTool.snapshots + Layout + + + Dock + + + Module + XCSnapshotModule + Proportion + 100% + + + Proportion + 100% + + + Name + Snapshots + ServiceClasses + + XCSnapshotModule + + StatusbarIsVisible + Yes + ToolbarConfiguration + xcode.toolbar.config.snapshots + WindowString + 315 824 300 550 0 0 1440 878 + WindowToolIsVisible + Yes + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.0950012207031 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + 0 + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 0 + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 3 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpointsV3 + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + 1 + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimatorV3 + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.projectFormatConflicts + Layout + + + Dock + + + Module + XCProjectFormatConflictsModule + Proportion + 100% + + + Proportion + 100% + + + Name + Project Format Conflicts + ServiceClasses + + XCProjectFormatConflictsModule + + StatusbarIsVisible + 0 + WindowContentMinSize + 450 300 + WindowString + 50 850 472 307 0 0 1440 877 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + 0 + + + Identifier + windowTool.refactoring + IncludeInToolsMenu + 0 + Layout + + + Dock + + + BecomeActive + 1 + GeometryConfiguration + + Frame + {0, 0}, {500, 335} + RubberWindowFrame + {0, 0}, {500, 335} + + Module + XCRefactoringModule + Proportion + 100% + + + Proportion + 100% + + + Name + Refactoring + ServiceClasses + + XCRefactoringModule + + WindowString + 200 200 500 356 0 0 1920 1200 + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/daniel.pbxuser b/KinectJNI_v0002/KinectJNI.xcodeproj/daniel.pbxuser new file mode 100644 index 0000000..0a11f15 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/daniel.pbxuser @@ -0,0 +1,882 @@ +// !$*UTF8*$! +{ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + activeBuildConfigurationName = Debug; + activeExecutable = 89D0F2C50F40E784007831A7 /* KinectJNI */; + activeTarget = 89D0F1C90F3B704E007831A7 /* KinectJNI */; + addToTargets = ( + 89D0F0480F393A6F007831A7 /* Compile Java */, + ); + codeSenseManager = 89D0F2CF0F40E7A1007831A7 /* Code sense */; + executables = ( + 89D0F2C50F40E784007831A7 /* KinectJNI */, + ); + perUserDictionary = { + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 776, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 888, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 848, + 60, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 314160652; + PBXWorkspaceStateSaveDate = 314160652; + }; + perUserProjectItems = { + 65415BC31290A99F00F30EBD /* PBXTextBookmark */ = 65415BC31290A99F00F30EBD /* PBXTextBookmark */; + 65415D011290AED400F30EBD /* PBXTextBookmark */ = 65415D011290AED400F30EBD /* PBXTextBookmark */; + 65415E281290B75800F30EBD /* PBXTextBookmark */ = 65415E281290B75800F30EBD /* PBXTextBookmark */; + 65415E2A1290B75800F30EBD /* PBXTextBookmark */ = 65415E2A1290B75800F30EBD /* PBXTextBookmark */; + 65415EAD1290D5D400F30EBD /* PBXTextBookmark */ = 65415EAD1290D5D400F30EBD /* PBXTextBookmark */; + 65415EAE1290D5D400F30EBD /* PBXTextBookmark */ = 65415EAE1290D5D400F30EBD /* PBXTextBookmark */; + 6564A6BC12B9B5D50003A8AC /* PBXTextBookmark */ = 6564A6BC12B9B5D50003A8AC /* PBXTextBookmark */; + 6564A6C512B9B5FD0003A8AC /* PBXTextBookmark */ = 6564A6C512B9B5FD0003A8AC /* PBXTextBookmark */; + 6564A71E12B9B7080003A8AC /* PBXTextBookmark */ = 6564A71E12B9B7080003A8AC /* PBXTextBookmark */; + 6564A72112B9B7080003A8AC /* PBXTextBookmark */ = 6564A72112B9B7080003A8AC /* PBXTextBookmark */; + 6564A77312B9B8B90003A8AC /* PBXTextBookmark */ = 6564A77312B9B8B90003A8AC /* PBXTextBookmark */; + 6564A7A612B9BAF80003A8AC /* PBXTextBookmark */ = 6564A7A612B9BAF80003A8AC /* PBXTextBookmark */; + 6564A7C312B9BCBE0003A8AC /* PBXTextBookmark */ = 6564A7C312B9BCBE0003A8AC /* PBXTextBookmark */; + 6564A7C412B9BCBE0003A8AC /* PBXTextBookmark */ = 6564A7C412B9BCBE0003A8AC /* PBXTextBookmark */; + 6564A7C512B9BCBE0003A8AC /* PBXTextBookmark */ = 6564A7C512B9BCBE0003A8AC /* PBXTextBookmark */; + 6564A7C612B9BCBE0003A8AC /* PBXTextBookmark */ = 6564A7C612B9BCBE0003A8AC /* PBXTextBookmark */; + 6564A7C712B9BCBE0003A8AC /* PBXTextBookmark */ = 6564A7C712B9BCBE0003A8AC /* PBXTextBookmark */; + 6564A7E612B9BDF20003A8AC /* PBXTextBookmark */ = 6564A7E612B9BDF20003A8AC /* PBXTextBookmark */; + 6564A7FA12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A7FA12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A7FB12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A7FB12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A7FC12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A7FC12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A7FE12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A7FE12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A7FF12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A7FF12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80012BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80012BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80112BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80112BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80212BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80212BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80312BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80312BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80412BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80412BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80512BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80512BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80612BA4AED0003A8AC /* PlistBookmark */ = 6564A80612BA4AED0003A8AC /* PlistBookmark */; + 6564A80712BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80712BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80812BA4AED0003A8AC /* PBXBookmark */ = 6564A80812BA4AED0003A8AC /* PBXBookmark */; + 6564A80912BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80912BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80B12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80B12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80C12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80C12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80D12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80D12BA4AED0003A8AC /* PBXTextBookmark */; + 6564A80E12BA4AED0003A8AC /* PBXTextBookmark */ = 6564A80E12BA4AED0003A8AC /* PBXTextBookmark */; + 65C5B8931290E43200E79FA5 /* PBXTextBookmark */ = 65C5B8931290E43200E79FA5 /* PBXTextBookmark */; + }; + sourceControlManager = 89D0F2CE0F40E7A1007831A7 /* Source Control */; + userBuildSettings = { + }; + }; + 653A255112906EFD007E71A5 /* Manifest */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{37, 0}"; + sepNavVisRange = "{0, 37}"; + }; + }; + 65415B6F1290A84E00F30EBD /* cameras.mm */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.objcpp; + name = cameras.mm; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/libfreenect/cameras.mm; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 5408}}"; + sepNavSelRange = "{450, 0}"; + sepNavVisRange = "{0, 896}"; + sepNavWindowFrame = "{{86, 33}, {1330, 770}}"; + }; + }; + 65415B701290A84E00F30EBD /* cameras.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = cameras.h; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/libfreenect/cameras.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 437}}"; + sepNavSelRange = "{561, 0}"; + sepNavVisRange = "{0, 570}"; + }; + }; + 65415B711290A84E00F30EBD /* inits.mm */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.objcpp; + name = inits.mm; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/libfreenect/inits.mm; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 1963}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 518}"; + }; + }; + 65415BC31290A99F00F30EBD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65D3600812907AB50032D2A2 /* NSObjCRuntime.h */; + name = "NSObjCRuntime.h: 180"; + rLen = 0; + rLoc = 6179; + rType = 0; + vrLen = 1426; + vrLoc = 5631; + }; + 65415D011290AED400F30EBD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415B701290A84E00F30EBD /* cameras.h */; + name = "cameras.h: 27"; + rLen = 0; + rLoc = 561; + rType = 0; + vrLen = 570; + vrLoc = 0; + }; + 65415D061290AEFC00F30EBD /* ofxKinect.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = ofxKinect.h; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/ofxKinect.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 1157}}"; + sepNavSelRange = "{554, 195}"; + sepNavVisRange = "{407, 818}"; + }; + }; + 65415D071290AEFC00F30EBD /* ofxKinect.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = ofxKinect.cpp; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/ofxKinect.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 3328}}"; + sepNavSelRange = "{701, 0}"; + sepNavVisRange = "{1115, 630}"; + }; + }; + 65415DF01290B2D000F30EBD /* ofxThread.mm */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.objcpp; + name = ofxThread.mm; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/ofxThread/src/ofxThread.mm; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 1495}}"; + sepNavSelRange = "{227, 0}"; + sepNavVisRange = "{0, 862}"; + }; + }; + 65415DF11290B2D100F30EBD /* ofxThread.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = ofxThread.h; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/ofxThread/src/ofxThread.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 793}}"; + sepNavSelRange = "{114, 0}"; + sepNavVisRange = "{0, 719}"; + }; + }; + 65415DF41290B31100F30EBD /* ofConstants.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = ofConstants.h; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/src/ofxThread/src/ofConstants.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 5096}}"; + sepNavSelRange = "{1120, 0}"; + sepNavVisRange = "{829, 1373}"; + }; + }; + 65415E281290B75800F30EBD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415DF41290B31100F30EBD /* ofConstants.h */; + name = "ofConstants.h: 47"; + rLen = 0; + rLoc = 1120; + rType = 0; + vrLen = 1373; + vrLoc = 829; + }; + 65415E2A1290B75800F30EBD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415DF01290B2D000F30EBD /* ofxThread.mm */; + name = "ofxThread.mm: 9"; + rLen = 0; + rLoc = 227; + rType = 0; + vrLen = 862; + vrLoc = 0; + }; + 65415EAD1290D5D400F30EBD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415DF11290B2D100F30EBD /* ofxThread.h */; + name = "ofxThread.h: 7"; + rLen = 0; + rLoc = 114; + rType = 0; + vrLen = 719; + vrLoc = 0; + }; + 65415EAE1290D5D400F30EBD /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415D061290AEFC00F30EBD /* ofxKinect.h */; + name = "ofxKinect.h: 32"; + rLen = 195; + rLoc = 554; + rType = 0; + vrLen = 818; + vrLoc = 407; + }; + 6564A6BC12B9B5D50003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415B6F1290A84E00F30EBD /* cameras.mm */; + name = "cameras.mm: 18"; + rLen = 0; + rLoc = 450; + rType = 0; + vrLen = 896; + vrLoc = 0; + }; + 6564A6C512B9B5FD0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415D071290AEFC00F30EBD /* ofxKinect.cpp */; + name = "ofxKinect.cpp: 32"; + rLen = 0; + rLoc = 701; + rType = 0; + vrLen = 630; + vrLoc = 1115; + }; + 6564A70012B9B6DF0003A8AC /* cameras.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 10569}}"; + sepNavSelRange = "{6513, 0}"; + sepNavVisRange = "{611, 815}"; + }; + }; + 6564A70212B9B6DF0003A8AC /* freenect_internal.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1379, 2041}}"; + sepNavSelRange = "{3859, 0}"; + sepNavVisRange = "{3046, 998}"; + }; + }; + 6564A70712B9B6DF0003A8AC /* usb_libusb10.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 3289}}"; + sepNavSelRange = "{1199, 0}"; + sepNavVisRange = "{175, 1180}"; + }; + }; + 6564A70812B9B6DF0003A8AC /* usb_libusb10.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1379, 1131}}"; + sepNavSelRange = "{1143, 0}"; + sepNavVisRange = "{973, 214}"; + sepNavWindowFrame = "{{38, 82}, {1330, 770}}"; + }; + }; + 6564A70D12B9B6DF0003A8AC /* libusb.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 17251}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1654}"; + }; + }; + 6564A71E12B9B7080003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65D3607412907E910032D2A2 /* NativeKinect.h */; + name = "NativeKinect.h: 10"; + rLen = 0; + rLoc = 152; + rType = 0; + vrLen = 152; + vrLoc = 0; + }; + 6564A72112B9B7080003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65D3607512907E910032D2A2 /* NativeKinect.cpp */; + name = "NativeKinect.cpp: 4"; + rLen = 1; + rLoc = 40; + rType = 0; + vrLen = 384; + vrLoc = 0; + }; + 6564A75E12B9B82C0003A8AC /* org_openkinect_Context.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 2613}}"; + sepNavSelRange = "{5061, 0}"; + sepNavVisRange = "{5036, 632}"; + sepNavWindowFrame = "{{61, 61}, {1330, 770}}"; + }; + }; + 6564A75F12B9B82C0003A8AC /* org_openkinect_Context.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 793}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 747}"; + }; + }; + 6564A76012B9B82C0003A8AC /* org_openkinect_Device.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1379, 1339}}"; + sepNavSelRange = "{2383, 0}"; + sepNavVisRange = "{0, 1640}"; + }; + }; + 6564A76112B9B82C0003A8AC /* org_openkinect_Device.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 1144}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 735}"; + }; + }; + 6564A77312B9B8B90003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A70712B9B6DF0003A8AC /* usb_libusb10.c */; + name = "usb_libusb10.c: 31"; + rLen = 0; + rLoc = 1199; + rType = 0; + vrLen = 1180; + vrLoc = 175; + }; + 6564A79712B9BAB10003A8AC /* libfreenect.hpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 2080}}"; + sepNavSelRange = "{2216, 27}"; + sepNavVisRange = "{1658, 1125}"; + }; + }; + 6564A79812B9BAB10003A8AC /* libfreenect.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 2145}}"; + sepNavSelRange = "{1773, 25}"; + sepNavVisRange = "{3810, 1498}"; + }; + }; + 6564A7A612B9BAF80003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A70012B9B6DF0003A8AC /* cameras.c */; + name = "cameras.c: 244"; + rLen = 0; + rLoc = 6513; + rType = 0; + vrLen = 815; + vrLoc = 611; + }; + 6564A7C312B9BCBE0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A76112B9B82C0003A8AC /* org_openkinect_Device.h */; + name = "org_openkinect_Device.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 735; + vrLoc = 0; + }; + 6564A7C412B9BCBE0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A76012B9B82C0003A8AC /* org_openkinect_Device.cpp */; + name = "org_openkinect_Device.cpp: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1182; + vrLoc = 77; + }; + 6564A7C512B9BCBE0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A75F12B9B82C0003A8AC /* org_openkinect_Context.h */; + name = "org_openkinect_Context.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 747; + vrLoc = 0; + }; + 6564A7C612B9BCBE0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A79712B9BAB10003A8AC /* libfreenect.hpp */; + name = "libfreenect.hpp: 68"; + rLen = 27; + rLoc = 2216; + rType = 0; + vrLen = 1125; + vrLoc = 1658; + }; + 6564A7C712B9BCBE0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A79812B9BAB10003A8AC /* libfreenect.h */; + name = "libfreenect.h: 50"; + rLen = 25; + rLoc = 1773; + rType = 0; + vrLen = 1498; + vrLoc = 3810; + }; + 6564A7CF12B9BD040003A8AC /* Example.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 2535}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1603}"; + }; + }; + 6564A7D212B9BD040003A8AC /* Acceleration.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{1237, 0}"; + sepNavVisRange = "{0, 1240}"; + }; + }; + 6564A7D412B9BD040003A8AC /* Context.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 1755}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{1125, 579}"; + }; + }; + 6564A7D512B9BD040003A8AC /* DepthFormat.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1229}"; + }; + }; + 6564A7D612B9BD040003A8AC /* Device.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 2340}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{1566, 798}"; + }; + }; + 6564A7D712B9BD040003A8AC /* Image.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 494}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{408, 840}"; + }; + }; + 6564A7D812B9BD040003A8AC /* LEDStatus.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1290}"; + }; + }; + 6564A7DA12B9BD040003A8AC /* LogLevel.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1249}"; + }; + }; + 6564A7E612B9BDF20003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A75E12B9B82C0003A8AC /* org_openkinect_Context.cpp */; + name = "org_openkinect_Context.cpp: 173"; + rLen = 0; + rLoc = 5061; + rType = 0; + vrLen = 632; + vrLoc = 5036; + }; + 6564A7FA12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7D712B9BD040003A8AC /* Image.java */; + name = "Image.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 840; + vrLoc = 408; + }; + 6564A7FB12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7D412B9BD040003A8AC /* Context.java */; + name = "Context.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 579; + vrLoc = 1125; + }; + 6564A7FC12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7FD12BA4AED0003A8AC /* find-classrefs.sh */; + name = "find-classrefs.sh: 30"; + rLen = 0; + rLoc = 1202; + rType = 0; + vrLen = 1215; + vrLoc = 0; + }; + 6564A7FD12BA4AED0003A8AC /* find-classrefs.sh */ = { + isa = PBXFileReference; + name = "find-classrefs.sh"; + path = "/Users/daniel/Dropbox/kinect/KinectJNI_v0002/make/find-classrefs.sh"; + sourceTree = ""; + }; + 6564A7FE12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7D812B9BD040003A8AC /* LEDStatus.java */; + name = "LEDStatus.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1290; + vrLoc = 0; + }; + 6564A7FF12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65D35FCA129077490032D2A2 /* KinectJNI.java */; + name = "KinectJNI.java: 18"; + rLen = 0; + rLoc = 401; + rType = 0; + vrLen = 935; + vrLoc = 0; + }; + 6564A80012BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7D612B9BD040003A8AC /* Device.java */; + name = "Device.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 798; + vrLoc = 1566; + }; + 6564A80112BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7D512B9BD040003A8AC /* DepthFormat.java */; + name = "DepthFormat.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1229; + vrLoc = 0; + }; + 6564A80212BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A70D12B9B6DF0003A8AC /* libusb.h */; + name = "libusb.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1654; + vrLoc = 0; + }; + 6564A80312BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65D35FCF129077670032D2A2 /* NativeKinect.java */; + name = "NativeKinect.java: 30"; + rLen = 0; + rLoc = 667; + rType = 0; + vrLen = 726; + vrLoc = 0; + }; + 6564A80412BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 653A255112906EFD007E71A5 /* Manifest */; + name = "Manifest: 1"; + rLen = 0; + rLoc = 37; + rType = 0; + vrLen = 37; + vrLoc = 0; + }; + 6564A80512BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 89C3F2910F5250A300B0048E /* English */; + name = "English: 15"; + rLen = 0; + rLoc = 157; + rType = 0; + vrLen = 157; + vrLoc = 0; + }; + 6564A80612BA4AED0003A8AC /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = 89D0F0230F392F20007831A7 /* Info.plist */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/resources/Info.plist; + rLen = 0; + rLoc = 9223372036854775807; + }; + 6564A80712BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 89D0F0220F392F20007831A7 /* English */; + name = "InfoPlist.strings: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 86; + vrLoc = 0; + }; + 6564A80812BA4AED0003A8AC /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 89D0F1BE0F3B68AD007831A7 /* GenericApp.icns */; + }; + 6564A80912BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A80A12BA4AED0003A8AC /* build.xml */; + name = "build.xml: 60"; + rLen = 3; + rLoc = 1488; + rType = 0; + vrLen = 1311; + vrLoc = 983; + }; + 6564A80A12BA4AED0003A8AC /* build.xml */ = { + isa = PBXFileReference; + name = build.xml; + path = /Users/daniel/Dropbox/kinect/KinectJNI_v0002/make/build.xml; + sourceTree = ""; + }; + 6564A80B12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7D212B9BD040003A8AC /* Acceleration.java */; + name = "Acceleration.java: 34"; + rLen = 0; + rLoc = 1237; + rType = 0; + vrLen = 1240; + vrLoc = 0; + }; + 6564A80C12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7DA12B9BD040003A8AC /* LogLevel.java */; + name = "LogLevel.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1249; + vrLoc = 0; + }; + 6564A80D12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7CF12B9BD040003A8AC /* Example.java */; + name = "Example.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1603; + vrLoc = 0; + }; + 6564A80E12BA4AED0003A8AC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6564A7CF12B9BD040003A8AC /* Example.java */; + name = "Example.java: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1603; + vrLoc = 0; + }; + 65C5B8931290E43200E79FA5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65415B711290A84E00F30EBD /* inits.mm */; + name = "inits.mm: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 518; + vrLoc = 0; + }; + 65D35FCA129077490032D2A2 /* KinectJNI.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{401, 0}"; + sepNavVisRange = "{0, 935}"; + }; + }; + 65D35FCF129077670032D2A2 /* NativeKinect.java */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{667, 0}"; + sepNavVisRange = "{0, 726}"; + sepNavWindowFrame = "{{38, 92}, {1134, 760}}"; + }; + }; + 65D3600812907AB50032D2A2 /* NSObjCRuntime.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSObjCRuntime.h; + path = /System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h; + sourceTree = ""; + }; + 65D3607412907E910032D2A2 /* NativeKinect.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 418}}"; + sepNavSelRange = "{152, 0}"; + sepNavVisRange = "{0, 152}"; + sepNavWindowFrame = "{{15, 113}, {1134, 760}}"; + }; + }; + 65D3607512907E910032D2A2 /* NativeKinect.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1379, 603}}"; + sepNavSelRange = "{164, 1}"; + sepNavVisRange = "{0, 361}"; + }; + }; + 89D0F0220F392F20007831A7 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1066, 594}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 86}"; + sepNavWindowFrame = "{{38, 92}, {1134, 760}}"; + }; + }; + 89D0F0230F392F20007831A7 /* Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {863, 821}}"; + sepNavSelRange = "{332, 0}"; + sepNavVisRange = "{0, 1078}"; + sepNavWindowFrame = "{{15, -5}, {922, 878}}"; + }; + }; + 89D0F0480F393A6F007831A7 /* Compile Java */ = { + activeExec = 0; + }; + 89D0F04F0F393AD9007831A7 /* Compile Native */ = { + activeExec = 0; + }; + 89D0F1C90F3B704E007831A7 /* KinectJNI */ = { + activeExec = 0; + }; + 89D0F2C50F40E784007831A7 /* KinectJNI */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 0; + configStateDict = { + "PBXLSLaunchAction-0" = { + PBXLSLaunchAction = 0; + PBXLSLaunchStartAction = 1; + PBXLSLaunchStdioStyle = 2; + PBXLSLaunchStyle = 0; + class = PBXLSRunLaunchConfig; + commandLineArgs = ( + ); + displayName = "Executable Runner"; + environment = { + }; + identifier = com.apple.Xcode.launch.runConfig; + remoteHostInfo = ""; + startActionInfo = ""; + }; + }; + customDataFormattersEnabled = 1; + dataTipCustomDataFormattersEnabled = 1; + dataTipShowTypeColumn = 1; + dataTipSortType = 0; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = KinectJNI; + savedGlobals = { + }; + showTypeColumn = 0; + sourceDirectories = ( + ); + startupPath = "<>"; + }; + 89D0F2CE0F40E7A1007831A7 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + repositoryNamesForRoots = { + "" = ""; + }; + }; + }; + 89D0F2CF0F40E7A1007831A7 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 8D1107260486CEB800E47090 /* Assemble Application */ = { + activeExec = 0; + executables = ( + 89D0F2C50F40E784007831A7 /* KinectJNI */, + ); + }; +} diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/default.pbxuser b/KinectJNI_v0002/KinectJNI.xcodeproj/default.pbxuser new file mode 100644 index 0000000..a0efb26 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/default.pbxuser @@ -0,0 +1,151 @@ +// !$*UTF8*$! +{ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + activeBuildConfigurationName = Debug; + activeExecutable = 89D0F2C50F40E784007831A7 /* KinectJNI */; + activeTarget = 89D0F1C90F3B704E007831A7 /* KinectJNI */; + codeSenseManager = 89D0F2CF0F40E7A1007831A7 /* Code sense */; + executables = ( + 89D0F2C50F40E784007831A7 /* KinectJNI */, + ); + perUserDictionary = { + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 131, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 243, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 203, + 60, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 255911812; + PBXWorkspaceStateSaveDate = 255911812; + }; + sourceControlManager = 89D0F2CE0F40E7A1007831A7 /* Source Control */; + userBuildSettings = { + }; + }; + 89D0F0230F392F20007831A7 /* Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {863, 821}}"; + sepNavSelRange = "{332, 0}"; + sepNavVisRange = "{0, 1078}"; + sepNavWindowFrame = "{{15, -5}, {922, 878}}"; + }; + }; + 89D0F0480F393A6F007831A7 /* Compile Java */ = { + activeExec = 0; + }; + 89D0F04F0F393AD9007831A7 /* Compile Native */ = { + activeExec = 0; + }; + 89D0F1C90F3B704E007831A7 /* KinectJNI */ = { + activeExec = 0; + }; + 89D0F2C50F40E784007831A7 /* KinectJNI */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 0; + configStateDict = { + "PBXLSLaunchAction-0" = { + PBXLSLaunchAction = 0; + PBXLSLaunchStartAction = 1; + PBXLSLaunchStdioStyle = 2; + PBXLSLaunchStyle = 0; + class = PBXLSRunLaunchConfig; + commandLineArgs = ( + ); + displayName = "Executable Runner"; + environment = { + }; + identifier = com.apple.Xcode.launch.runConfig; + remoteHostInfo = ""; + startActionInfo = ""; + }; + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = "KinectJNI"; + sourceDirectories = ( + ); + startupPath = "<>"; + }; + 89D0F2CE0F40E7A1007831A7 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + }; + 89D0F2CF0F40E7A1007831A7 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 8D1107260486CEB800E47090 /* Assemble Application */ = { + activeExec = 0; + executables = ( + 89D0F2C50F40E784007831A7 /* KinectJNI */, + ); + }; +} diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.mode1v3 b/KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.mode1v3 new file mode 100644 index 0000000..61abe9c --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.mode1v3 @@ -0,0 +1,1392 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCProjectFormatConflictsModule + Name + Project Format Conflicts List + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + BundleLoadPath + + MaxInstances + n + Module + XCSnapshotModule + Name + Snapshots Tool + + + BundlePath + /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1v3 + FavBarConfig + + PBXProjectModuleGUID + C92E5B2C12B95A3F00817239 + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1v3 + MajorVersion + 33 + MinorVersion + 0 + Name + Default + Notifications + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + active-target-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-goOrGo + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 329 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 89D0F0260F392F48007831A7 + 89D0F0280F392F48007831A7 + 89D0F0200F392F20007831A7 + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 1 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {329, 577}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {346, 595}} + GroupTreeTableConfiguration + + MainColumn + 329 + + RubberWindowFrame + 566 410 947 636 0 0 1920 1178 + + Module + PBXSmartGroupTreeModule + Proportion + 346pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + NativeKinect.cpp + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + NativeKinect.cpp + _historyCapacity + 0 + bookmark + C94B6D7512D5055D00AE6F57 + history + + C94B6D7412D5055D00AE6F57 + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {596, 417}} + RubberWindowFrame + 566 410 947 636 0 0 1920 1178 + + Module + PBXNavigatorGroup + Proportion + 417pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 422}, {596, 173}} + RubberWindowFrame + 566 410 947 636 0 0 1920 1178 + + Module + XCDetailModule + Proportion + 173pt + + + Proportion + 596pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + C94B6D7612D5055D00AE6F57 + 1CE0B1FE06471DED0097A5F4 + C94B6D7712D5055D00AE6F57 + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.defaultV3 + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + 0 + Layout + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 337}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 1 + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 355}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 373 269 690 397 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 100% + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.shortV3 + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 0.0 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + C92E5B2D12B95A3F00817239 + /Users/itpstudent/Dropbox/kinect/github/shiffman.libfreenect/libfreenect/wrappers/java/processing/KinectJNI_v0002/KinectJNI.xcodeproj + + WindowString + 566 410 947 636 0 0 1920 1178 + WindowToolsV3 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + NativeKinect.cpp + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1054, 125}} + RubberWindowFrame + 587 616 1054 407 0 0 1920 1178 + + Module + PBXNavigatorGroup + Proportion + 125pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1011 + + GeometryConfiguration + + Frame + {{0, 130}, {1054, 236}} + RubberWindowFrame + 587 616 1054 407 0 0 1920 1178 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 366pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + C92E5B2D12B95A3F00817239 + C94B6D7312D5054E00AE6F57 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.buildV3 + WindowString + 587 616 1054 407 0 0 1920 1178 + WindowToolGUID + C92E5B2D12B95A3F00817239 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {316, 185}} + {{316, 0}, {378, 185}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {694, 185}} + {{0, 185}, {694, 196}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {694, 381}} + PBXDebugSessionStackFrameViewKey + + DebugVariablesTableConfiguration + + Name + 120 + Value + 85 + Summary + 148 + + Frame + {{316, 0}, {378, 185}} + RubberWindowFrame + 587 601 694 422 0 0 1920 1178 + + RubberWindowFrame + 587 601 694 422 0 0 1920 1178 + + Module + PBXDebugSessionModule + Proportion + 381pt + + + Proportion + 381pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + C92E5B3112B95AA000817239 + 1C162984064C10D400B95A72 + C92E5B3212B95AA000817239 + C92E5B3312B95AA000817239 + C92E5B3412B95AA000817239 + C92E5B3512B95AA000817239 + C92E5B3612B95AA000817239 + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + WindowString + 587 601 694 422 0 0 1920 1178 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {650, 209}} + RubberWindowFrame + 587 773 650 250 0 0 1920 1178 + + Module + PBXDebugCLIModule + Proportion + 209pt + + + Proportion + 209pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + 1C78EAAD065D492600B07095 + C92E5B3712B95AA000817239 + 1C78EAAC065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.consoleV3 + WindowString + 587 773 650 250 0 0 1920 1178 + WindowToolGUID + 1C78EAAD065D492600B07095 + WindowToolIsVisible + + + + Identifier + windowTool.snapshots + Layout + + + Dock + + + Module + XCSnapshotModule + Proportion + 100% + + + Proportion + 100% + + + Name + Snapshots + ServiceClasses + + XCSnapshotModule + + StatusbarIsVisible + Yes + ToolbarConfiguration + xcode.toolbar.config.snapshots + WindowString + 315 824 300 550 0 0 1440 878 + WindowToolIsVisible + Yes + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.0950012207031 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + 0 + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 0 + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 3 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpointsV3 + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + 1 + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimatorV3 + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.projectFormatConflicts + Layout + + + Dock + + + Module + XCProjectFormatConflictsModule + Proportion + 100% + + + Proportion + 100% + + + Name + Project Format Conflicts + ServiceClasses + + XCProjectFormatConflictsModule + + StatusbarIsVisible + 0 + WindowContentMinSize + 450 300 + WindowString + 50 850 472 307 0 0 1440 877 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + 0 + + + Identifier + windowTool.refactoring + IncludeInToolsMenu + 0 + Layout + + + Dock + + + BecomeActive + 1 + GeometryConfiguration + + Frame + {0, 0}, {500, 335} + RubberWindowFrame + {0, 0}, {500, 335} + + Module + XCRefactoringModule + Proportion + 100% + + + Proportion + 100% + + + Name + Refactoring + ServiceClasses + + XCRefactoringModule + + WindowString + 200 200 500 356 0 0 1920 1200 + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.pbxuser b/KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.pbxuser new file mode 100644 index 0000000..0cdf784 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/itpstudent.pbxuser @@ -0,0 +1,180 @@ +// !$*UTF8*$! +{ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + activeBuildConfigurationName = Debug; + activeExecutable = 89D0F2C50F40E784007831A7 /* KinectJNI */; + activeTarget = 89D0F1C90F3B704E007831A7 /* KinectJNI */; + codeSenseManager = 89D0F2CF0F40E7A1007831A7 /* Code sense */; + executables = ( + 89D0F2C50F40E784007831A7 /* KinectJNI */, + ); + perUserDictionary = { + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 131, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 357, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 203, + 60, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 315950397; + PBXWorkspaceStateSaveDate = 315950397; + }; + perUserProjectItems = { + C94B6D7412D5055D00AE6F57 /* PBXTextBookmark */ = C94B6D7412D5055D00AE6F57 /* PBXTextBookmark */; + C94B6D7512D5055D00AE6F57 /* PBXTextBookmark */ = C94B6D7512D5055D00AE6F57 /* PBXTextBookmark */; + }; + sourceControlManager = 89D0F2CE0F40E7A1007831A7 /* Source Control */; + userBuildSettings = { + }; + }; + 65D3607512907E910032D2A2 /* NativeKinect.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {993, 266}}"; + sepNavSelRange = "{165, 82}"; + sepNavVisRange = "{137, 111}"; + }; + }; + 89D0F0230F392F20007831A7 /* Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {863, 821}}"; + sepNavSelRange = "{332, 0}"; + sepNavVisRange = "{0, 1078}"; + sepNavWindowFrame = "{{15, -5}, {922, 878}}"; + }; + }; + 89D0F0480F393A6F007831A7 /* Compile Java */ = { + activeExec = 0; + }; + 89D0F04F0F393AD9007831A7 /* Compile Native */ = { + activeExec = 0; + }; + 89D0F1C90F3B704E007831A7 /* KinectJNI */ = { + activeExec = 0; + }; + 89D0F2C50F40E784007831A7 /* KinectJNI */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 0; + configStateDict = { + "PBXLSLaunchAction-0" = { + PBXLSLaunchAction = 0; + PBXLSLaunchStartAction = 1; + PBXLSLaunchStdioStyle = 2; + PBXLSLaunchStyle = 0; + class = PBXLSRunLaunchConfig; + commandLineArgs = ( + ); + displayName = "Executable Runner"; + environment = { + }; + identifier = com.apple.Xcode.launch.runConfig; + remoteHostInfo = ""; + startActionInfo = ""; + }; + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = KinectJNI; + sourceDirectories = ( + ); + startupPath = "<>"; + }; + 89D0F2CE0F40E7A1007831A7 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + }; + 89D0F2CF0F40E7A1007831A7 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 8D1107260486CEB800E47090 /* Assemble Application */ = { + activeExec = 0; + executables = ( + 89D0F2C50F40E784007831A7 /* KinectJNI */, + ); + }; + C94B6D7412D5055D00AE6F57 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: shiffman_kinect_NativeKinect.h: No such file or directory"; + fRef = 65D3607512907E910032D2A2 /* NativeKinect.cpp */; + rLen = 1; + rLoc = 11; + rType = 1; + }; + C94B6D7512D5055D00AE6F57 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 65D3607512907E910032D2A2 /* NativeKinect.cpp */; + name = "NativeKinect.cpp: 12"; + rLen = 82; + rLoc = 165; + rType = 0; + vrLen = 361; + vrLoc = 0; + }; +} diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/project.pbxproj b/KinectJNI_v0002/KinectJNI.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d7f10d3 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/project.pbxproj @@ -0,0 +1,799 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXAggregateTarget section */ + 89D0F1C90F3B704E007831A7 /* KinectJNI */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 89D0F1D20F3B7080007831A7 /* Build configuration list for PBXAggregateTarget "KinectJNI" */; + buildPhases = ( + ); + dependencies = ( + 89D0F1D10F3B7062007831A7 /* PBXTargetDependency */, + 89D0F1CF0F3B7062007831A7 /* PBXTargetDependency */, + 89D0F1CD0F3B7062007831A7 /* PBXTargetDependency */, + ); + name = KinectJNI; + productName = KinectJNI; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 24A9FEEC18D7A56A002751BD /* libusb-1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 24A9FEEB18D7A56A002751BD /* libusb-1.0.a */; }; + 65415BAE1290A8AD00F30EBD /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415BAD1290A8AD00F30EBD /* Carbon.framework */; }; + 65415BB01290A8AD00F30EBD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415BAF1290A8AD00F30EBD /* CoreFoundation.framework */; }; + 65415BB21290A8AD00F30EBD /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415BB11290A8AD00F30EBD /* CoreServices.framework */; }; + 65415BF11290AB1500F30EBD /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415BF01290AB1500F30EBD /* IOKit.framework */; }; + 65415CC21290AB4D00F30EBD /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415CC11290AB4D00F30EBD /* AGL.framework */; }; + 65415CC41290AB4D00F30EBD /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415CC31290AB4D00F30EBD /* AppKit.framework */; }; + 65415CC61290AB4D00F30EBD /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65415CC51290AB4D00F30EBD /* ApplicationServices.framework */; }; + 6564A71012B9B6DF0003A8AC /* cameras.c in Sources */ = {isa = PBXBuildFile; fileRef = 6564A70012B9B6DF0003A8AC /* cameras.c */; }; + 6564A71112B9B6DF0003A8AC /* core.c in Sources */ = {isa = PBXBuildFile; fileRef = 6564A70112B9B6DF0003A8AC /* core.c */; }; + 6564A71212B9B6DF0003A8AC /* freenect_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 6564A70212B9B6DF0003A8AC /* freenect_internal.h */; }; + 6564A71512B9B6DF0003A8AC /* tilt.c in Sources */ = {isa = PBXBuildFile; fileRef = 6564A70612B9B6DF0003A8AC /* tilt.c */; }; + 6564A71612B9B6DF0003A8AC /* usb_libusb10.c in Sources */ = {isa = PBXBuildFile; fileRef = 6564A70712B9B6DF0003A8AC /* usb_libusb10.c */; }; + 6564A71712B9B6DF0003A8AC /* usb_libusb10.h in Headers */ = {isa = PBXBuildFile; fileRef = 6564A70812B9B6DF0003A8AC /* usb_libusb10.h */; }; + 6564A71812B9B6DF0003A8AC /* libusb.h in Headers */ = {isa = PBXBuildFile; fileRef = 6564A70D12B9B6DF0003A8AC /* libusb.h */; }; + 6564A71912B9B6DF0003A8AC /* usb-1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6564A70F12B9B6DF0003A8AC /* usb-1.0.a */; }; + 6564A76212B9B82C0003A8AC /* org_openkinect_Context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6564A75E12B9B82C0003A8AC /* org_openkinect_Context.cpp */; }; + 6564A76312B9B82C0003A8AC /* org_openkinect_Context.h in Headers */ = {isa = PBXBuildFile; fileRef = 6564A75F12B9B82C0003A8AC /* org_openkinect_Context.h */; }; + 6564A76412B9B82C0003A8AC /* org_openkinect_Device.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6564A76012B9B82C0003A8AC /* org_openkinect_Device.cpp */; }; + 6564A76512B9B82C0003A8AC /* org_openkinect_Device.h in Headers */ = {isa = PBXBuildFile; fileRef = 6564A76112B9B82C0003A8AC /* org_openkinect_Device.h */; }; + 6564A79912B9BAB10003A8AC /* libfreenect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6564A79712B9BAB10003A8AC /* libfreenect.hpp */; }; + 6564A79A12B9BAB10003A8AC /* libfreenect.h in Headers */ = {isa = PBXBuildFile; fileRef = 6564A79812B9BAB10003A8AC /* libfreenect.h */; }; + 65D3607612907E910032D2A2 /* NativeKinect.h in Headers */ = {isa = PBXBuildFile; fileRef = 65D3607412907E910032D2A2 /* NativeKinect.h */; }; + 65D3607712907E910032D2A2 /* NativeKinect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65D3607512907E910032D2A2 /* NativeKinect.cpp */; }; + 89C3F2920F5250A300B0048E /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 89C3F2900F5250A300B0048E /* Credits.rtf */; }; + 89D0F0240F392F20007831A7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 89D0F0210F392F20007831A7 /* InfoPlist.strings */; }; + 89D0F0410F39306C007831A7 /* JavaApplicationStub in Copy Executable */ = {isa = PBXBuildFile; fileRef = 89D0F03E0F39304A007831A7 /* JavaApplicationStub */; }; + 89D0F05C0F39404F007831A7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + 89D0F0850F394066007831A7 /* JavaNativeFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */; }; + 89D0F11C0F394183007831A7 /* libKinect.jnilib in Copy Java Resources */ = {isa = PBXBuildFile; fileRef = 89D0F0500F393AD9007831A7 /* libKinect.jnilib */; }; + 89D0F1870F3A2442007831A7 /* JavaVM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89D0F1860F3A2442007831A7 /* JavaVM.framework */; }; + 89D0F1BF0F3B68AD007831A7 /* GenericApp.icns in Resources */ = {isa = PBXBuildFile; fileRef = 89D0F1BE0F3B68AD007831A7 /* GenericApp.icns */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 89D0F1CC0F3B7062007831A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D1107260486CEB800E47090; + remoteInfo = "Assemble Application"; + }; + 89D0F1CE0F3B7062007831A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 89D0F04F0F393AD9007831A7; + remoteInfo = "Compile Native"; + }; + 89D0F1D00F3B7062007831A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 89D0F0480F393A6F007831A7; + remoteInfo = "Compile Java"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 89D0F0440F393070007831A7 /* Copy Executable */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + 89D0F0410F39306C007831A7 /* JavaApplicationStub in Copy Executable */, + ); + name = "Copy Executable"; + runOnlyForDeploymentPostprocessing = 0; + }; + 89D0F11F0F394189007831A7 /* Copy Java Resources */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 15; + files = ( + 89D0F11C0F394183007831A7 /* libKinect.jnilib in Copy Java Resources */, + ); + name = "Copy Java Resources"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 24A9FEEB18D7A56A002751BD /* libusb-1.0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libusb-1.0.a"; path = "src/libusb/osx/libs/libusb-1.0.a"; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 653A255112906EFD007E71A5 /* Manifest */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Manifest; sourceTree = ""; }; + 65415BAD1290A8AD00F30EBD /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 65415BAF1290A8AD00F30EBD /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 65415BB11290A8AD00F30EBD /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; + 65415BF01290AB1500F30EBD /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = ../../../../../../../../../System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + 65415CC11290AB4D00F30EBD /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = ../../../../../../../../../System/Library/Frameworks/AGL.framework; sourceTree = SDKROOT; }; + 65415CC31290AB4D00F30EBD /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = ../../../../../../../../../System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 65415CC51290AB4D00F30EBD /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = ../../../../../../../../../System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; }; + 6564A70012B9B6DF0003A8AC /* cameras.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cameras.c; sourceTree = ""; }; + 6564A70112B9B6DF0003A8AC /* core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = core.c; sourceTree = ""; }; + 6564A70212B9B6DF0003A8AC /* freenect_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freenect_internal.h; sourceTree = ""; }; + 6564A70512B9B6DF0003A8AC /* libfreenect.pc.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libfreenect.pc.in; sourceTree = ""; }; + 6564A70612B9B6DF0003A8AC /* tilt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tilt.c; sourceTree = ""; }; + 6564A70712B9B6DF0003A8AC /* usb_libusb10.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = usb_libusb10.c; sourceTree = ""; }; + 6564A70812B9B6DF0003A8AC /* usb_libusb10.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = usb_libusb10.h; sourceTree = ""; }; + 6564A70D12B9B6DF0003A8AC /* libusb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libusb.h; sourceTree = ""; }; + 6564A70F12B9B6DF0003A8AC /* usb-1.0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "usb-1.0.a"; sourceTree = ""; }; + 6564A72812B9B72C0003A8AC /* usb-1.0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "usb-1.0.a"; path = "src/libusb/osx/libs/usb-1.0.a"; sourceTree = ""; }; + 6564A75E12B9B82C0003A8AC /* org_openkinect_Context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = org_openkinect_Context.cpp; sourceTree = ""; }; + 6564A75F12B9B82C0003A8AC /* org_openkinect_Context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = org_openkinect_Context.h; sourceTree = ""; }; + 6564A76012B9B82C0003A8AC /* org_openkinect_Device.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = org_openkinect_Device.cpp; sourceTree = ""; }; + 6564A76112B9B82C0003A8AC /* org_openkinect_Device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = org_openkinect_Device.h; sourceTree = ""; }; + 6564A79712B9BAB10003A8AC /* libfreenect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = libfreenect.hpp; sourceTree = ""; }; + 6564A79812B9BAB10003A8AC /* libfreenect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfreenect.h; sourceTree = ""; }; + 6564A7CF12B9BD040003A8AC /* Example.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = Example.java; sourceTree = ""; }; + 6564A7D212B9BD040003A8AC /* Acceleration.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = Acceleration.java; sourceTree = ""; }; + 6564A7D312B9BD040003A8AC /* ColorFormat.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = ColorFormat.java; sourceTree = ""; }; + 6564A7D412B9BD040003A8AC /* Context.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = Context.java; sourceTree = ""; }; + 6564A7D512B9BD040003A8AC /* DepthFormat.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = DepthFormat.java; sourceTree = ""; }; + 6564A7D612B9BD040003A8AC /* Device.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = Device.java; sourceTree = ""; }; + 6564A7D712B9BD040003A8AC /* Image.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = Image.java; sourceTree = ""; }; + 6564A7D812B9BD040003A8AC /* LEDStatus.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = LEDStatus.java; sourceTree = ""; }; + 6564A7D912B9BD040003A8AC /* Logger.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = Logger.java; sourceTree = ""; }; + 6564A7DA12B9BD040003A8AC /* LogLevel.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; path = LogLevel.java; sourceTree = ""; }; + 65D35FCA129077490032D2A2 /* KinectJNI.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = KinectJNI.java; path = java/shiffman/kinect/KinectJNI.java; sourceTree = ""; }; + 65D35FCF129077670032D2A2 /* NativeKinect.java */ = {isa = PBXFileReference; explicitFileType = sourcecode.java; fileEncoding = 4; name = NativeKinect.java; path = java/shiffman/kinect/NativeKinect.java; sourceTree = ""; }; + 65D3607412907E910032D2A2 /* NativeKinect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeKinect.h; sourceTree = ""; }; + 65D3607512907E910032D2A2 /* NativeKinect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NativeKinect.cpp; sourceTree = ""; }; + 89B60E390F414E1200C86CA9 /* lib */ = {isa = PBXFileReference; lastKnownFileType = folder; name = lib; path = "Library/Xcode/Project Templates/Java/JNI Application/lib"; sourceTree = DEVELOPER_DIR; }; + 89C3F2910F5250A300B0048E /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = ""; }; + 89D0F0220F392F20007831A7 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 89D0F0230F392F20007831A7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 89D0F03E0F39304A007831A7 /* JavaApplicationStub */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = JavaApplicationStub; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub; sourceTree = ""; }; + 89D0F0500F393AD9007831A7 /* libKinect.jnilib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libKinect.jnilib; sourceTree = BUILT_PRODUCTS_DIR; }; + 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaNativeFoundation.framework; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework; sourceTree = ""; }; + 89D0F0870F39408C007831A7 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = /System/Library/Frameworks/AddressBook.framework; sourceTree = ""; }; + 89D0F1390F3948A9007831A7 /* make */ = {isa = PBXFileReference; lastKnownFileType = folder; path = make; sourceTree = ""; }; + 89D0F1860F3A2442007831A7 /* JavaVM.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaVM.framework; path = /System/Library/Frameworks/JavaVM.framework; sourceTree = ""; }; + 89D0F1BE0F3B68AD007831A7 /* GenericApp.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = GenericApp.icns; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/GenericApp.icns; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* KinectJNI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KinectJNI.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 89D0F04E0F393AD9007831A7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 24A9FEEC18D7A56A002751BD /* libusb-1.0.a in Frameworks */, + 89D0F05C0F39404F007831A7 /* Cocoa.framework in Frameworks */, + 89D0F0850F394066007831A7 /* JavaNativeFoundation.framework in Frameworks */, + 89D0F1870F3A2442007831A7 /* JavaVM.framework in Frameworks */, + 65415BAE1290A8AD00F30EBD /* Carbon.framework in Frameworks */, + 65415BB01290A8AD00F30EBD /* CoreFoundation.framework in Frameworks */, + 65415BB21290A8AD00F30EBD /* CoreServices.framework in Frameworks */, + 65415BF11290AB1500F30EBD /* IOKit.framework in Frameworks */, + 65415CC21290AB4D00F30EBD /* AGL.framework in Frameworks */, + 65415CC41290AB4D00F30EBD /* AppKit.framework in Frameworks */, + 65415CC61290AB4D00F30EBD /* ApplicationServices.framework in Frameworks */, + 6564A71912B9B6DF0003A8AC /* usb-1.0.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 89D0F0870F39408C007831A7 /* AddressBook.framework */, + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + 89D0F1860F3A2442007831A7 /* JavaVM.framework */, + 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 24A9FEEB18D7A56A002751BD /* libusb-1.0.a */, + 6564A72812B9B72C0003A8AC /* usb-1.0.a */, + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 89D0F0500F393AD9007831A7 /* libKinect.jnilib */, + 8D1107320486CEB800E47090 /* KinectJNI.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* KinectJNI */ = { + isa = PBXGroup; + children = ( + 89D0F0260F392F48007831A7 /* Source */, + 89D0F0200F392F20007831A7 /* Resources */, + 89D0F1390F3948A9007831A7 /* make */, + 89B60E390F414E1200C86CA9 /* lib */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + 65415BAD1290A8AD00F30EBD /* Carbon.framework */, + 65415BAF1290A8AD00F30EBD /* CoreFoundation.framework */, + 65415BB11290A8AD00F30EBD /* CoreServices.framework */, + 65415BF01290AB1500F30EBD /* IOKit.framework */, + 65415CC11290AB4D00F30EBD /* AGL.framework */, + 65415CC31290AB4D00F30EBD /* AppKit.framework */, + 65415CC51290AB4D00F30EBD /* ApplicationServices.framework */, + ); + name = KinectJNI; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6564A6FF12B9B6DF0003A8AC /* libfreenect */ = { + isa = PBXGroup; + children = ( + 6564A79712B9BAB10003A8AC /* libfreenect.hpp */, + 6564A79812B9BAB10003A8AC /* libfreenect.h */, + 6564A70012B9B6DF0003A8AC /* cameras.c */, + 6564A70112B9B6DF0003A8AC /* core.c */, + 6564A70212B9B6DF0003A8AC /* freenect_internal.h */, + 6564A70512B9B6DF0003A8AC /* libfreenect.pc.in */, + 6564A70612B9B6DF0003A8AC /* tilt.c */, + 6564A70712B9B6DF0003A8AC /* usb_libusb10.c */, + 6564A70812B9B6DF0003A8AC /* usb_libusb10.h */, + ); + path = libfreenect; + sourceTree = ""; + }; + 6564A70912B9B6DF0003A8AC /* libusb */ = { + isa = PBXGroup; + children = ( + 6564A70A12B9B6DF0003A8AC /* osx */, + ); + path = libusb; + sourceTree = ""; + }; + 6564A70A12B9B6DF0003A8AC /* osx */ = { + isa = PBXGroup; + children = ( + 6564A70B12B9B6DF0003A8AC /* include */, + 6564A70E12B9B6DF0003A8AC /* libs */, + ); + path = osx; + sourceTree = ""; + }; + 6564A70B12B9B6DF0003A8AC /* include */ = { + isa = PBXGroup; + children = ( + 6564A70C12B9B6DF0003A8AC /* libusb-1.0 */, + ); + path = include; + sourceTree = ""; + }; + 6564A70C12B9B6DF0003A8AC /* libusb-1.0 */ = { + isa = PBXGroup; + children = ( + 6564A70D12B9B6DF0003A8AC /* libusb.h */, + ); + path = "libusb-1.0"; + sourceTree = ""; + }; + 6564A70E12B9B6DF0003A8AC /* libs */ = { + isa = PBXGroup; + children = ( + 6564A70F12B9B6DF0003A8AC /* usb-1.0.a */, + ); + path = libs; + sourceTree = ""; + }; + 6564A7D012B9BD040003A8AC /* org */ = { + isa = PBXGroup; + children = ( + 6564A7D112B9BD040003A8AC /* openkinect */, + ); + path = org; + sourceTree = ""; + }; + 6564A7D112B9BD040003A8AC /* openkinect */ = { + isa = PBXGroup; + children = ( + 6564A7D212B9BD040003A8AC /* Acceleration.java */, + 6564A7D312B9BD040003A8AC /* ColorFormat.java */, + 6564A7D412B9BD040003A8AC /* Context.java */, + 6564A7D512B9BD040003A8AC /* DepthFormat.java */, + 6564A7D612B9BD040003A8AC /* Device.java */, + 6564A7D712B9BD040003A8AC /* Image.java */, + 6564A7D812B9BD040003A8AC /* LEDStatus.java */, + 6564A7D912B9BD040003A8AC /* Logger.java */, + 6564A7DA12B9BD040003A8AC /* LogLevel.java */, + ); + path = openkinect; + sourceTree = ""; + }; + 6598C511129067A9009C53C6 /* java */ = { + isa = PBXGroup; + children = ( + 6564A7CF12B9BD040003A8AC /* Example.java */, + 6564A7D012B9BD040003A8AC /* org */, + 65D35FC6129076F30032D2A2 /* shiffman */, + ); + name = java; + sourceTree = ""; + }; + 65D35FC6129076F30032D2A2 /* shiffman */ = { + isa = PBXGroup; + children = ( + 65D35FC7129076F80032D2A2 /* kinect */, + ); + name = shiffman; + sourceTree = ""; + }; + 65D35FC7129076F80032D2A2 /* kinect */ = { + isa = PBXGroup; + children = ( + 65D35FCF129077670032D2A2 /* NativeKinect.java */, + 65D35FCA129077490032D2A2 /* KinectJNI.java */, + ); + name = kinect; + sourceTree = ""; + }; + 89D0F0200F392F20007831A7 /* Resources */ = { + isa = PBXGroup; + children = ( + 653A255112906EFD007E71A5 /* Manifest */, + 89C3F2900F5250A300B0048E /* Credits.rtf */, + 89D0F0230F392F20007831A7 /* Info.plist */, + 89D0F0210F392F20007831A7 /* InfoPlist.strings */, + 89D0F03E0F39304A007831A7 /* JavaApplicationStub */, + 89D0F1BE0F3B68AD007831A7 /* GenericApp.icns */, + ); + name = Resources; + path = resources; + sourceTree = ""; + }; + 89D0F0260F392F48007831A7 /* Source */ = { + isa = PBXGroup; + children = ( + 6564A6FF12B9B6DF0003A8AC /* libfreenect */, + 6564A70912B9B6DF0003A8AC /* libusb */, + 6598C511129067A9009C53C6 /* java */, + 89D0F0280F392F48007831A7 /* native */, + ); + name = Source; + path = src; + sourceTree = ""; + }; + 89D0F0280F392F48007831A7 /* native */ = { + isa = PBXGroup; + children = ( + 6564A75E12B9B82C0003A8AC /* org_openkinect_Context.cpp */, + 6564A75F12B9B82C0003A8AC /* org_openkinect_Context.h */, + 6564A76012B9B82C0003A8AC /* org_openkinect_Device.cpp */, + 6564A76112B9B82C0003A8AC /* org_openkinect_Device.h */, + 65D3607412907E910032D2A2 /* NativeKinect.h */, + 65D3607512907E910032D2A2 /* NativeKinect.cpp */, + ); + path = native; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 89D0F04C0F393AD9007831A7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 65D3607612907E910032D2A2 /* NativeKinect.h in Headers */, + 6564A71212B9B6DF0003A8AC /* freenect_internal.h in Headers */, + 6564A71712B9B6DF0003A8AC /* usb_libusb10.h in Headers */, + 6564A71812B9B6DF0003A8AC /* libusb.h in Headers */, + 6564A76312B9B82C0003A8AC /* org_openkinect_Context.h in Headers */, + 6564A76512B9B82C0003A8AC /* org_openkinect_Device.h in Headers */, + 6564A79912B9BAB10003A8AC /* libfreenect.hpp in Headers */, + 6564A79A12B9BAB10003A8AC /* libfreenect.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXLegacyTarget section */ + 89D0F0480F393A6F007831A7 /* Compile Java */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "-e -f \"${SRCROOT}/make/build.xml\" -debug \"$ACTION\""; + buildConfigurationList = 89D0F04B0F393AB7007831A7 /* Build configuration list for PBXLegacyTarget "Compile Java" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/ant; + buildWorkingDirectory = ""; + dependencies = ( + ); + name = "Compile Java"; + passBuildSettingsInEnvironment = 1; + productName = "Compile Java"; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 89D0F04F0F393AD9007831A7 /* Compile Native */ = { + isa = PBXNativeTarget; + buildConfigurationList = 89D0F0530F393AF8007831A7 /* Build configuration list for PBXNativeTarget "Compile Native" */; + buildPhases = ( + 89D0F1360F394748007831A7 /* Run javah */, + 89D0F04C0F393AD9007831A7 /* Headers */, + 89D0F04D0F393AD9007831A7 /* Sources */, + 89D0F04E0F393AD9007831A7 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Compile Native"; + productName = "Compile Native"; + productReference = 89D0F0500F393AD9007831A7 /* libKinect.jnilib */; + productType = "com.apple.product-type.library.dynamic"; + }; + 8D1107260486CEB800E47090 /* Assemble Application */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Assemble Application" */; + buildPhases = ( + 89D0F0440F393070007831A7 /* Copy Executable */, + 89D0F11F0F394189007831A7 /* Copy Java Resources */, + 8D1107290486CEB800E47090 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Assemble Application"; + productInstallPath = "$(HOME)/Applications"; + productName = KinectJNI; + productReference = 8D1107320486CEB800E47090 /* KinectJNI.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0510; + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "KinectJNI" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* KinectJNI */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 89D0F1C90F3B704E007831A7 /* KinectJNI */, + 89D0F0480F393A6F007831A7 /* Compile Java */, + 89D0F04F0F393AD9007831A7 /* Compile Native */, + 8D1107260486CEB800E47090 /* Assemble Application */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 89D0F0240F392F20007831A7 /* InfoPlist.strings in Resources */, + 89D0F1BF0F3B68AD007831A7 /* GenericApp.icns in Resources */, + 89C3F2920F5250A300B0048E /* Credits.rtf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 89D0F1360F394748007831A7 /* Run javah */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run javah"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# find the jar file to dig into\nJAR_TO_JAVAH=\"${BUILT_PRODUCTS_DIR}/AddressBook.jar\"\n\n# use a helper script to list all classes inside the jar, and all classes referenced by those classes\nCLASS_LIST=`\"${SRCROOT}/make/find-classrefs.sh\" \"${JAR_TO_JAVAH}\" | xargs`\n\n# run javah for all classes inside the jar, and all classes referenced by those classes\njavah -verbose -jni -classpath \"${JAR_TO_JAVAH}\" -d \"${DERIVED_SOURCES_DIR}\" ${CLASS_LIST}"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 89D0F04D0F393AD9007831A7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 65D3607712907E910032D2A2 /* NativeKinect.cpp in Sources */, + 6564A71012B9B6DF0003A8AC /* cameras.c in Sources */, + 6564A71112B9B6DF0003A8AC /* core.c in Sources */, + 6564A71512B9B6DF0003A8AC /* tilt.c in Sources */, + 6564A71612B9B6DF0003A8AC /* usb_libusb10.c in Sources */, + 6564A76212B9B82C0003A8AC /* org_openkinect_Context.cpp in Sources */, + 6564A76412B9B82C0003A8AC /* org_openkinect_Device.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 89D0F1CD0F3B7062007831A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D1107260486CEB800E47090 /* Assemble Application */; + targetProxy = 89D0F1CC0F3B7062007831A7 /* PBXContainerItemProxy */; + }; + 89D0F1CF0F3B7062007831A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 89D0F04F0F393AD9007831A7 /* Compile Native */; + targetProxy = 89D0F1CE0F3B7062007831A7 /* PBXContainerItemProxy */; + }; + 89D0F1D10F3B7062007831A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 89D0F0480F393A6F007831A7 /* Compile Java */; + targetProxy = 89D0F1D00F3B7062007831A7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 89C3F2900F5250A300B0048E /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 89C3F2910F5250A300B0048E /* English */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 89D0F0210F392F20007831A7 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 89D0F0220F392F20007831A7 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 89D0F0490F393A6F007831A7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = AddressBook; + }; + name = Debug; + }; + 89D0F04A0F393A6F007831A7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = kinect; + }; + name = Release; + }; + 89D0F0510F393ADA007831A7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + EXECUTABLE_EXTENSION = jnilib; + EXECUTABLE_PREFIX = lib; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = ""; + HEADER_SEARCH_PATHS = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Headers\""; + INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "/opt/local/lib/**", + "\"$(SRCROOT)/src/libs/libusb/osx/libs\"", + "\"$(SRCROOT)/src/libusb/osx/libs\"", + "$(SRCROOT)", + "$(PROJECT_DIR)/src/libusb/osx/libs", + ); + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = Kinect; + SDKROOT = macosx; + VALID_ARCHS = "x86_64 i386"; + }; + name = Debug; + }; + 89D0F0520F393ADA007831A7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + EXECUTABLE_EXTENSION = jnilib; + EXECUTABLE_PREFIX = lib; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Versions/A/Frameworks\"", + ); + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = ""; + HEADER_SEARCH_PATHS = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Headers\""; + INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "/opt/local/lib/**", + "\"$(SRCROOT)/src/libs/libusb/osx/libs\"", + "\"$(SRCROOT)/src/libusb/osx/libs\"", + "$(SRCROOT)", + "$(PROJECT_DIR)/src/libusb/osx/libs", + ); + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = Kinect; + SDKROOT = macosx; + VALID_ARCHS = "x86_64 i386"; + }; + name = Release; + }; + 89D0F1CA0F3B704F007831A7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = KinectJNI; + }; + name = Debug; + }; + 89D0F1CB0F3B704F007831A7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = KinectJNI; + }; + name = Release; + }; + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = resources/Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = KinectJNI; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + INFOPLIST_FILE = resources/Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = KinectJNI; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + SDKROOT = macosx10.9; + VALID_ARCHS = i386; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + PRODUCT_NAME = ""; + SDKROOT = macosx10.9; + VALID_ARCHS = i386; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 89D0F04B0F393AB7007831A7 /* Build configuration list for PBXLegacyTarget "Compile Java" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 89D0F0490F393A6F007831A7 /* Debug */, + 89D0F04A0F393A6F007831A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 89D0F0530F393AF8007831A7 /* Build configuration list for PBXNativeTarget "Compile Native" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 89D0F0510F393ADA007831A7 /* Debug */, + 89D0F0520F393ADA007831A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 89D0F1D20F3B7080007831A7 /* Build configuration list for PBXAggregateTarget "KinectJNI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 89D0F1CA0F3B704F007831A7 /* Debug */, + 89D0F1CB0F3B704F007831A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Assemble Application" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "KinectJNI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..10e6a94 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcshareddata/KinectJNI.xccheckout b/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcshareddata/KinectJNI.xccheckout new file mode 100644 index 0000000..2116a38 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcshareddata/KinectJNI.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + D0A5F31C-560B-4B1D-9E5A-68C14E638541 + IDESourceControlProjectName + KinectJNI + IDESourceControlProjectOriginsDictionary + + FD432709-5EB2-4BCB-8069-50347650746C + https://github.com/shiffman/libfreenect.git + + IDESourceControlProjectPath + wrappers/java/processing/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + FD432709-5EB2-4BCB-8069-50347650746C + ../../../../../.. + + IDESourceControlProjectURL + https://github.com/shiffman/libfreenect.git + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + FD432709-5EB2-4BCB-8069-50347650746C + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + FD432709-5EB2-4BCB-8069-50347650746C + IDESourceControlWCCName + libfreenect + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcuserdata/jespera.xcuserdatad/UserInterfaceState.xcuserstate b/KinectJNI_v0002/KinectJNI.xcodeproj/project.xcworkspace/xcuserdata/jespera.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..dbea5139e8556a2bdaaad523f3fb1ab98f001b8d GIT binary patch literal 18908 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 + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Assemble Application.xcscheme b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Assemble Application.xcscheme new file mode 100644 index 0000000..9dd0350 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Assemble Application.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Java.xcscheme b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Java.xcscheme new file mode 100644 index 0000000..7245df7 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Java.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Native.xcscheme b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Native.xcscheme new file mode 100644 index 0000000..ce10628 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/Compile Native.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/KinectJNI.xcscheme b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/KinectJNI.xcscheme new file mode 100644 index 0000000..f248530 --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/KinectJNI.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/xcschememanagement.plist b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..00548fa --- /dev/null +++ b/KinectJNI_v0002/KinectJNI.xcodeproj/xcuserdata/jespera.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,52 @@ + + + + + SchemeUserState + + Assemble Application.xcscheme + + orderHint + 3 + + Compile Java.xcscheme + + orderHint + 1 + + Compile Native.xcscheme + + orderHint + 2 + + KinectJNI.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 89D0F0480F393A6F007831A7 + + primary + + + 89D0F04F0F393AD9007831A7 + + primary + + + 89D0F1C90F3B704E007831A7 + + primary + + + 8D1107260486CEB800E47090 + + primary + + + + + diff --git a/KinectJNI_v0002/lib/eawt-stubs.jar b/KinectJNI_v0002/lib/eawt-stubs.jar new file mode 100644 index 0000000000000000000000000000000000000000..160d62b669d18bc8d67a67df9e2d4b1bed8c544c GIT binary patch literal 4189 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 MrSl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Nothing to do for install-headers phase" + + diff --git a/KinectJNI_v0002/make/find-classrefs.sh b/KinectJNI_v0002/make/find-classrefs.sh new file mode 100755 index 0000000..2217580 --- /dev/null +++ b/KinectJNI_v0002/make/find-classrefs.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +# Prints all class references made by all classes in a Jar file +# Depends on the output formatting of javap + +# create a temporary working directory +dir=`mktemp -d $TMPDIR/classrefs.XXXXXX` + +asm_dump="$dir/asm_dump" +all_classes="$dir/all_classes" + +# for each class in a Jar file, dump the full assembly +javap -c -classpath "$1" `/usr/bin/jar tf "$1" | grep "\.class" | sort | xargs | sed -e 's/\.class//g'` > $asm_dump + +# dump the initial list of all classes in the Jar file +/usr/bin/jar tf $1 | grep "\.class" | sed -e 's/\.class//g' >> $all_classes + +# dump all static class references +cat $asm_dump | grep //class | awk -F"//class " '{print $2}' | sort | uniq >> $all_classes + +# dump all references to classes made in methods +cat $asm_dump | grep //Method | awk -F"//Method " '{print $2}' | sort | uniq | grep "\." | awk -F"." '{print $1}' | sort | uniq >> $all_classes + +# dump all references to classes by direct field access +cat $asm_dump | grep //Field | awk -F"//Field " '{print $2}' | sort | uniq | grep "\:L" | awk -F"\:L" '{print $2}' | sort | uniq | awk -F"\;" '{print $1}' >> $all_classes + +# sort and reformat +sort $all_classes | uniq | grep -v "\"" | sed -e 's/\//\./g' + +# cleanup +rm -rf $dir diff --git a/KinectJNI_v0002/resources/English.lproj/Credits.rtf b/KinectJNI_v0002/resources/English.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/KinectJNI_v0002/resources/English.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/KinectJNI_v0002/resources/English.lproj/InfoPlist.strings b/KinectJNI_v0002/resources/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..435426338a45c823b216ea8fe8c64c22121e5230 GIT binary patch literal 174 zcmW-a!4APd6h+V4S2SHVqS%U+4T*^02Z|OcZPOy*kNhM~CX;#hy*u}v`F&FoB9_z~ z$hdOhP0ms8skU@FHI*8vg>~Un*bitzzT>W2ntp{;LQ2oGV#}NdH@OuX-!r)xd$)3C d5*jyJ`6teSF_jbZ34iQZ)3+NlWaN#R@CReX9xng@ literal 0 HcmV?d00001 diff --git a/KinectJNI_v0002/resources/Info.plist b/KinectJNI_v0002/resources/Info.plist new file mode 100644 index 0000000..4e1f288 --- /dev/null +++ b/KinectJNI_v0002/resources/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + JavaApplicationStub + CFBundleIconFile + GenericApp.icns + CFBundleIdentifier + shiffman.kinect.KinectJNI + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + KinectJNI + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CFBundleShortVersionString + 1.0 + Java + + ClassPath + $JAVAROOT/AddressBook.jar + JVMVersion + 1.5+ + MainClass + shiffman.kinect.KinectJNI + Properties + + apple.laf.useScreenMenuBar + true + + + + diff --git a/KinectJNI_v0002/resources/Manifest b/KinectJNI_v0002/resources/Manifest new file mode 100644 index 0000000..02ff0b6 --- /dev/null +++ b/KinectJNI_v0002/resources/Manifest @@ -0,0 +1 @@ +Main-Class: shiffman.kinect.KinectJNI \ No newline at end of file diff --git a/KinectJNI_v0002/src/Example.java b/KinectJNI_v0002/src/Example.java new file mode 100644 index 0000000..6ad8aff --- /dev/null +++ b/KinectJNI_v0002/src/Example.java @@ -0,0 +1,214 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +import java.io.File; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ShortBuffer; +import javax.imageio.ImageIO; +import org.openkinect.Context; +import org.openkinect.Device; +import org.openkinect.Acceleration; +import org.openkinect.Image; +import org.openkinect.LEDStatus; + +/** + * @author Michael Nischt + */ +public class Example +{ + public static void main(String[] args) throws IOException + { + final int width = 640, height = 480; + final BufferedImage color = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + final BufferedImage depth = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + //final BufferedImage depth = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); + + + Context context = Context.getContext(); + + if(context.devices() < 1) + { + System.out.println("No Kinect devices found."); + return; + } + + Device device = context.getDevice(0); + + device.light(LEDStatus.LED_GREEN); + device.tilt(-5); + + device.depth(new Image() + { + public void data(ByteBuffer image) + { + ShortBuffer data = image.asShortBuffer(); + + for(int y=0; y>8) { + case 0: + b = 255; + g = 255-lb; + r = 255-lb; + break; + case 1: + b = 255; + g = lb; + r = 0; + break; + case 2: + b = 255-lb; + g = 255; + r = 0; + break; + case 3: + b = 0; + g = 255; + r = lb; + break; + case 4: + b = 0; + g = 255-lb; + r = 255; + break; + case 5: + b = 0; + g = 0; + r = 255-lb; + break; + default: + r = 0; + g = 0; + b = 0; + break; + } + + int pixel = (0xFF) << 24 + | (b & 0xFF) << 16 + | (g & 0xFF) << 8 + | (r & 0xFF) << 0; + + return pixel; + } + + static int depth2intensity(short depth) + { + int d = Math.round((1 - (depth / 2047f)) * 255f); + int pixel = (0xFF) << 24 + | (d & 0xFF) << 16 + | (d & 0xFF) << 8 + | (d & 0xFF) << 0; + + return pixel; + } + +} \ No newline at end of file diff --git a/KinectJNI_v0002/src/java/shiffman/kinect/KinectJNI.java b/KinectJNI_v0002/src/java/shiffman/kinect/KinectJNI.java new file mode 100644 index 0000000..be70df6 --- /dev/null +++ b/KinectJNI_v0002/src/java/shiffman/kinect/KinectJNI.java @@ -0,0 +1,39 @@ +// +// KinectJNI.java +// KinectJNI +// +// Created by Daniel Shiffman on 11/14/10. +// Copyright (c) 2010 ITP. All rights reserved. +// +// For information on setting Java configuration information, including +// setting Java properties, refer to the documentation at +// http://developer.apple.com/techpubs/java/java.html +// + +package shiffman.kinect; + +/** + * @author daniel + */ +public class KinectJNI { + public static void main(final String[] args) throws InterruptedException{ + System.out.println("FUCK YAH " + NativeKinect.getNum()); + + /*NativeKinect.init(); + + int counter = 0; + while (true) { + NativeKinect.update(); + int[] pixels = NativeKinect.getPixels(); + Thread.sleep(100); + + int color = pixels[pixels.length/2]; + System.out.println("COUNTER: " + counter + " GOT PIXELS: " + pixels.length + " A color: " + color); + counter++; + if (counter > 300) { + break; + } + } + NativeKinect.close();*/ + } +} diff --git a/KinectJNI_v0002/src/java/shiffman/kinect/NativeAddressBook.java b/KinectJNI_v0002/src/java/shiffman/kinect/NativeAddressBook.java new file mode 100644 index 0000000..d5a07c9 --- /dev/null +++ b/KinectJNI_v0002/src/java/shiffman/kinect/NativeAddressBook.java @@ -0,0 +1,36 @@ +// +// NativeAddressBook.java +// KinectJNI +// +// Created by Daniel Shiffman on 11/14/10. +// Copyright (c) 2010 ITP. All rights reserved. +// + +package shiffman.kinect; + +import java.util.*; + +/** + * Abstraction for the Mac OS X AddressBook API + * + * Creates a copy of contacts from the address book, and vends Person + * objects. Uses JNI to obtain simple Lists, Maps, Strings, and Number + * representations of + * + * @author daniel + */ +public class NativeAddressBook { + static { + // ensure native JNI library is loaded + System.loadLibrary("Kinect"); + } + + // JNI method which obtains the UID of the "me" card in Address Book.app + private static native int getNumber(); + + public static int getNum() { + return getNumber(); + } + + +} diff --git a/KinectJNI_v0002/src/java/shiffman/kinect/NativeKinect.java b/KinectJNI_v0002/src/java/shiffman/kinect/NativeKinect.java new file mode 100644 index 0000000..45296fa --- /dev/null +++ b/KinectJNI_v0002/src/java/shiffman/kinect/NativeKinect.java @@ -0,0 +1,35 @@ +// +// NativeAddressBook.java +// KinectJNI +// +// Created by Daniel Shiffman on 11/14/10. +// Copyright (c) 2010 ITP. All rights reserved. +// + +package shiffman.kinect; + +import java.util.*; + +/** + * Abstraction for the Mac OS X AddressBook API + * + * Creates a copy of contacts from the address book, and vends Person + * objects. Uses JNI to obtain simple Lists, Maps, Strings, and Number + * representations of + * + * @author daniel + */ +public class NativeKinect { + static { + // ensure native JNI library is loaded + System.loadLibrary("Kinect"); + } + + // JNI method which obtains the UID of the "me" card in Address Book.app + private static native int getNumber(); + + public static int getNum() { + return getNumber(); + } + +} diff --git a/KinectJNI_v0002/src/libfreenect/cameras.c b/KinectJNI_v0002/src/libfreenect/cameras.c new file mode 100644 index 0000000..5039d3b --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/cameras.c @@ -0,0 +1,786 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#include +#include +#include +#include + +#include "freenect_internal.h" + +struct pkt_hdr { + uint8_t magic[2]; + uint8_t pad; + uint8_t flag; + uint8_t unk1; + uint8_t seq; + uint8_t unk2; + uint8_t unk3; + uint32_t timestamp; +}; + +extern const struct caminit inits[]; +extern const int num_inits; + +static int stream_process(freenect_context *ctx, packet_stream *strm, uint8_t *pkt, int len) +{ + if (len < 12) + return 0; + + struct pkt_hdr *hdr = (void*)pkt; + uint8_t *data = pkt + sizeof(*hdr); + int datalen = len - sizeof(*hdr); + + if (hdr->magic[0] != 'R' || hdr->magic[1] != 'B') { + FN_LOG(strm->valid_frames < 2 ? LL_SPEW : LL_NOTICE, \ + "[Stream %02x] Invalid magic %02x%02x\n", strm->flag, hdr->magic[0], hdr->magic[1]); + return 0; + } + + FN_FLOOD("[Stream %02x] Packet with flag: %02x\n", strm->flag, hdr->flag); + + uint8_t sof = strm->flag|1; + uint8_t mof = strm->flag|2; + uint8_t eof = strm->flag|5; + + // sync if required, dropping packets until SOF + if (!strm->synced) { + if (hdr->flag != sof) { + FN_SPEW("[Stream %02x] Not synced yet...\n", strm->flag); + return 0; + } + strm->synced = 1; + strm->seq = hdr->seq; + strm->pkt_num = 0; + strm->valid_pkts = 0; + strm->got_pkts = 0; + } + + int got_frame = 0; + + // handle lost packets + if (strm->seq != hdr->seq) { + uint8_t lost = hdr->seq - strm->seq; + FN_LOG(strm->valid_frames < 2 ? LL_SPEW : LL_INFO, \ + "[Stream %02x] Lost %d packets\n", strm->flag, lost); + if (lost > 5) { + FN_LOG(strm->valid_frames < 2 ? LL_SPEW : LL_NOTICE, \ + "[Stream %02x] Lost too many packets, resyncing...\n", strm->flag); + strm->synced = 0; + return 0; + } + strm->seq = hdr->seq; + int left = strm->pkts_per_frame - strm->pkt_num; + if (left <= lost) { + strm->pkt_num = lost - left; + strm->valid_pkts = strm->got_pkts; + strm->got_pkts = 0; + got_frame = 1; + strm->timestamp = strm->last_timestamp; + strm->valid_frames++; + } else { + strm->pkt_num += lost; + } + } + + // check the header to make sure it's what we expect + if (!(strm->pkt_num == 0 && hdr->flag == sof) && + !(strm->pkt_num == strm->pkts_per_frame-1 && hdr->flag == eof) && + !(strm->pkt_num > 0 && strm->pkt_num < strm->pkts_per_frame-1 && hdr->flag == mof)) { + FN_LOG(strm->valid_frames < 2 ? LL_SPEW : LL_NOTICE, \ + "[Stream %02x] Inconsistent flag %02x with %d packets in buf (%d total), resyncing...\n", + strm->flag, hdr->flag, strm->pkt_num, strm->pkts_per_frame); + strm->synced = 0; + return got_frame; + } + + // copy data + if (datalen > strm->pkt_size) { + FN_LOG(strm->valid_frames < 2 ? LL_SPEW : LL_WARNING, \ + "[Stream %02x] Expected %d data bytes, but got %d. Dropping...\n", strm->flag, strm->pkt_size, datalen); + return got_frame; + } + + if (datalen != strm->pkt_size && hdr->flag != eof) + FN_LOG(strm->valid_frames < 2 ? LL_SPEW : LL_WARNING, \ + "[Stream %02x] Expected %d data bytes, but got only %d\n", strm->flag, strm->pkt_size, datalen); + + uint8_t *dbuf = strm->raw_buf + strm->pkt_num * strm->pkt_size; + memcpy(dbuf, data, datalen); + + strm->pkt_num++; + strm->seq++; + strm->got_pkts++; + + strm->last_timestamp = fn_le32(hdr->timestamp); + + if (strm->pkt_num == strm->pkts_per_frame) { + strm->pkt_num = 0; + strm->valid_pkts = strm->got_pkts; + strm->got_pkts = 0; + strm->timestamp = strm->last_timestamp; + strm->valid_frames++; + return 1; + } else { + return got_frame; + } +} + +static void stream_initbufs(freenect_context *ctx, packet_stream *strm, int rlen, int plen) +{ + if (strm->usr_buf) { + strm->lib_buf = NULL; + strm->proc_buf = strm->usr_buf; + } else { + strm->lib_buf = malloc(plen); + strm->proc_buf = strm->lib_buf; + } + + if (rlen == 0) { + strm->split_bufs = 0; + strm->raw_buf = strm->proc_buf; + } else { + strm->split_bufs = 1; + strm->raw_buf = malloc(rlen); + } +} + +static void stream_freebufs(freenect_context *ctx, packet_stream *strm) +{ + if (strm->split_bufs) + free(strm->raw_buf); + if (strm->lib_buf) + free(strm->lib_buf); + + strm->raw_buf = NULL; + strm->proc_buf = NULL; + strm->lib_buf = NULL; +} + +static int stream_setbuf(freenect_context *ctx, packet_stream *strm, void *pbuf) +{ + if (!strm->running) { + strm->usr_buf = pbuf; + return 0; + } else { + if (!pbuf && !strm->lib_buf) { + FN_ERROR("Attempted to set buffer to NULL but stream was started with no internal buffer\n"); + return -1; + } + strm->usr_buf = pbuf; + + if (!pbuf) + strm->proc_buf = strm->lib_buf; + else + strm->proc_buf = pbuf; + + if (!strm->split_bufs) + strm->raw_buf = strm->proc_buf; + return 0; + } +} + +// Unpack buffer of (vw bit) data into padded 16bit buffer. +static inline void convert_packed_to_16bit(uint8_t *raw, uint16_t *frame, int vw, int len) +{ + int mask = (1 << vw) - 1; + uint32_t buffer = 0; + int bitsIn = 0; + while (len--) { + while (bitsIn < vw) { + buffer = (buffer << 8) | *(raw++); + bitsIn += 8; + } + bitsIn -= vw; + *(frame++) = (buffer >> bitsIn) & mask; + } +} + +// Unpack buffer of (vw bit) data into 8bit buffer, dropping LSBs +static inline void convert_packed_to_8bit(uint8_t *raw, uint8_t *frame, int vw, int len) +{ + uint32_t buffer = 0; + int bitsIn = 0; + while (len--) { + while (bitsIn < vw) { + buffer = (buffer << 8) | *(raw++); + bitsIn += 8; + } + bitsIn -= vw; + *(frame++) = buffer >> (bitsIn+vw-8); + } +} + +static void depth_process(freenect_device *dev, uint8_t *pkt, int len) +{ + freenect_context *ctx = dev->parent; + + if (len == 0) + return; + + if (!dev->depth.running) + return; + + int got_frame = stream_process(ctx, &dev->depth, pkt, len); + + if (!got_frame) + return; + + FN_SPEW("Got depth frame %d/%d packets arrived, TS %08x\n", + dev->depth.valid_pkts, dev->depth.pkts_per_frame, dev->depth.timestamp); + + switch (dev->depth_format) { + case FREENECT_DEPTH_11BIT: + convert_packed_to_16bit(dev->depth.raw_buf, dev->depth.proc_buf, 11, FREENECT_FRAME_PIX); + break; + case FREENECT_DEPTH_10BIT: + convert_packed_to_16bit(dev->depth.raw_buf, dev->depth.proc_buf, 10, FREENECT_FRAME_PIX); + break; + case FREENECT_DEPTH_10BIT_PACKED: + case FREENECT_DEPTH_11BIT_PACKED: + break; + } + if (dev->depth_cb) + dev->depth_cb(dev, dev->depth.proc_buf, dev->depth.timestamp); +} + +static void convert_bayer_to_rgb(uint8_t *raw_buf, uint8_t *proc_buf) +{ + int x,y; + /* Pixel arrangement: + * G R G R G R G R + * B G B G B G B G + * G R G R G R G R + * B G B G B G B G + * G R G R G R G R + * B G B G B G B G + * + * To convert a Bayer-pattern into RGB you have to handle four pattern + * configurations: + * 1) 2) 3) 4) + * B1 B1 G1 B2 R1 G1 R2 R1 <- previous line + * R1 G1 R2 G2 R1 G3 G2 B1 G3 B1 G1 B2 <- current line + * B2 B3 G4 B4 R3 G4 R4 R2 <- next line + * ^ ^ ^ + * | | next pixel + * | current pixel + * previous pixel + * + * The RGB values (r,g,b) for each configuration are calculated as + * follows: + * + * 1) r = (R1 + R2) / 2 + * g = G1 + * b = (B1 + B2) / 2 + * + * 2) r = R1 + * g = (G1 + G2 + G3 + G4) / 4 + * b = (B1 + B2 + B3 + B4) / 4 + * + * 3) r = (R1 + R2 + R3 + R4) / 4 + * g = (G1 + G2 + G3 + G4) / 4 + * b = B1 + * + * 4) r = (R1 + R2) / 2 + * g = G1 + * b = (B1 + B2) / 2 + * + * To efficiently calculate these values, two 32bit integers are used + * as "shift-buffers". One integer to store the 3 horizontal bayer pixel + * values (previous, current, next) of the current line. The other + * integer to store the vertical average value of the bayer pixels + * (previous, current, next) of the previous and next line. + * + * The boundary conditions for the first and last line and the first + * and last column are solved via mirroring the second and second last + * line and the second and second last column. + * + * To reduce slow memory access, the values of a rgb pixel are packet + * into a 32bit variable and transfered together. + */ + + uint8_t *dst = proc_buf; // pointer to destination + + uint8_t *prevLine; // pointer to previous, current and next line + uint8_t *curLine; // of the source bayer pattern + uint8_t *nextLine; + + // storing horizontal values in hVals: + // previous << 16, current << 8, next + uint32_t hVals; + // storing vertical averages in vSums: + // previous << 16, current << 8, next + uint32_t vSums; + + // init curLine and nextLine pointers + curLine = raw_buf; + nextLine = curLine + 640; + for (y = 0; y < 480; ++y) { + + if ((y > 0) && (y < 479)) + prevLine = curLine - 640; // normal case + else if (y == 0) + prevLine = nextLine; // top boundary case + else + nextLine = prevLine; // bottom boundary case + + // init horizontal shift-buffer with current value + hVals = (*(curLine++) << 8); + // handle left column boundary case + hVals |= (*curLine << 16); + // init vertical average shift-buffer with current values average + vSums = ((*(prevLine++) + *(nextLine++)) << 7) & 0xFF00; + // handle left column boundary case + vSums |= ((*prevLine + *nextLine) << 15) & 0xFF0000; + + // store if line is odd or not + uint8_t yOdd = y & 1; + // the right column boundary case is not handled inside this loop + // thus the "639" + for (x = 0; x < 639; ++x) { + // place next value in shift buffers + hVals |= *(curLine++); + vSums |= (*(prevLine++) + *(nextLine++)) >> 1; + + // calculate the horizontal sum as this sum is needed in + // any configuration + uint8_t hSum = ((uint8_t)(hVals >> 16) + (uint8_t)(hVals)) >> 1; + + if (yOdd == 0) { + if ((x & 1) == 0) { + // Configuration 1 + *(dst++) = hSum; // r + *(dst++) = hVals >> 8; // g + *(dst++) = vSums >> 8; // b + } else { + // Configuration 2 + *(dst++) = hVals >> 8; + *(dst++) = (hSum + (uint8_t)(vSums >> 8)) >> 1; + *(dst++) = ((uint8_t)(vSums >> 16) + (uint8_t)(vSums)) >> 1; + } + } else { + if ((x & 1) == 0) { + // Configuration 3 + *(dst++) = ((uint8_t)(vSums >> 16) + (uint8_t)(vSums)) >> 1; + *(dst++) = (hSum + (uint8_t)(vSums >> 8)) >> 1; + *(dst++) = hVals >> 8; + } else { + // Configuration 4 + *(dst++) = vSums >> 8; + *(dst++) = hVals >> 8; + *(dst++) = hSum; + } + } + + // shift the shift-buffers + hVals <<= 8; + vSums <<= 8; + } // end of for x loop + // right column boundary case, mirroring second last column + hVals |= (uint8_t)(hVals >> 16); + vSums |= (uint8_t)(vSums >> 16); + + // the horizontal sum simplifies to the second last column value + uint8_t hSum = (uint8_t)(hVals); + + if (yOdd == 0) { + if ((x & 1) == 0) { + *(dst++) = hSum; + *(dst++) = hVals >> 8; + *(dst++) = vSums >> 8; + } else { + *(dst++) = hVals >> 8; + *(dst++) = (hSum + (uint8_t)(vSums >> 8)) >> 1; + *(dst++) = vSums; + } + } else { + if ((x & 1) == 0) { + *(dst++) = vSums; + *(dst++) = (hSum + (uint8_t)(vSums >> 8)) >> 1; + *(dst++) = hVals >> 8; + } else { + *(dst++) = vSums >> 8; + *(dst++) = hVals >> 8; + *(dst++) = hSum; + } + } + + } // end of for y loop +} + +static void video_process(freenect_device *dev, uint8_t *pkt, int len) +{ + freenect_context *ctx = dev->parent; + + if (len == 0) + return; + + if (!dev->video.running) + return; + + int got_frame = stream_process(ctx, &dev->video, pkt, len); + + if (!got_frame) + return; + + FN_SPEW("Got RGB frame %d/%d packets arrived, TS %08x\n", dev->video.valid_pkts, + dev->video.pkts_per_frame, dev->video.timestamp); + + switch (dev->video_format) { + case FREENECT_VIDEO_RGB: + convert_bayer_to_rgb(dev->video.raw_buf, dev->video.proc_buf); + break; + case FREENECT_VIDEO_BAYER: + break; + case FREENECT_VIDEO_IR_10BIT: + convert_packed_to_16bit(dev->video.raw_buf, dev->video.proc_buf, 10, FREENECT_IR_FRAME_PIX); + break; + case FREENECT_VIDEO_IR_10BIT_PACKED: + break; + case FREENECT_VIDEO_IR_8BIT: + convert_packed_to_8bit(dev->video.raw_buf, dev->video.proc_buf, 10, FREENECT_IR_FRAME_PIX); + break; + } + + if (dev->video_cb) + dev->video_cb(dev, dev->video.proc_buf, dev->video.timestamp); +} + +typedef struct { + uint8_t magic[2]; + uint16_t len; + uint16_t cmd; + uint16_t tag; +} cam_hdr; + +static int send_cmd(freenect_device *dev, uint16_t cmd, void *cmdbuf, unsigned int cmd_len, void *replybuf, unsigned int reply_len) +{ + freenect_context *ctx = dev->parent; + int res, actual_len; + uint8_t obuf[0x400]; + uint8_t ibuf[0x200]; + cam_hdr *chdr = (void*)obuf; + cam_hdr *rhdr = (void*)ibuf; + + if (cmd_len & 1 || cmd_len > (0x400 - sizeof(*chdr))) { + FN_ERROR("send_cmd: Invalid command length (0x%x)\n", cmd_len); + return -1; + } + + chdr->magic[0] = 0x47; + chdr->magic[1] = 0x4d; + chdr->cmd = fn_le16(cmd); + chdr->tag = fn_le16(dev->cam_tag); + chdr->len = fn_le16(cmd_len / 2); + + memcpy(obuf+sizeof(*chdr), cmdbuf, cmd_len); + + res = fnusb_control(&dev->usb_cam, 0x40, 0, 0, 0, obuf, cmd_len + sizeof(*chdr)); + FN_SPEW("Control cmd=%04x tag=%04x len=%04x: %d\n", cmd, dev->cam_tag, cmd_len, res); + if (res < 0) { + FN_ERROR("send_cmd: Output control transfer failed (%d)\n", res); + return res; + } + + do { + actual_len = fnusb_control(&dev->usb_cam, 0xc0, 0, 0, 0, ibuf, 0x200); + } while (actual_len == 0); + FN_SPEW("Control reply: %d\n", res); + if (actual_len < sizeof(*rhdr)) { + FN_ERROR("send_cmd: Input control transfer failed (%d)\n", res); + return res; + } + actual_len -= sizeof(*rhdr); + + if (rhdr->magic[0] != 0x52 || rhdr->magic[1] != 0x42) { + FN_ERROR("send_cmd: Bad magic %02x %02x\n", rhdr->magic[0], rhdr->magic[1]); + return -1; + } + if (rhdr->cmd != chdr->cmd) { + FN_ERROR("send_cmd: Bad cmd %02x != %02x\n", rhdr->cmd, chdr->cmd); + return -1; + } + if (rhdr->tag != chdr->tag) { + FN_ERROR("send_cmd: Bad tag %04x != %04x\n", rhdr->tag, chdr->tag); + return -1; + } + if (fn_le16(rhdr->len) != (actual_len/2)) { + FN_ERROR("send_cmd: Bad len %04x != %04x\n", fn_le16(rhdr->len), (int)(actual_len/2)); + return -1; + } + + if (actual_len > reply_len) { + FN_WARNING("send_cmd: Data buffer is %d bytes long, but got %d bytes\n", reply_len, actual_len); + memcpy(replybuf, ibuf+sizeof(*rhdr), reply_len); + } else { + memcpy(replybuf, ibuf+sizeof(*rhdr), actual_len); + } + + dev->cam_tag++; + + return actual_len; +} + +static int write_register(freenect_device *dev, uint16_t reg, uint16_t data) +{ + freenect_context *ctx = dev->parent; + uint16_t reply[2]; + uint16_t cmd[2]; + int res; + + cmd[0] = fn_le16(reg); + cmd[1] = fn_le16(data); + + FN_DEBUG("Write Reg 0x%04x <= 0x%02x\n", reg, data); + res = send_cmd(dev, 0x03, cmd, 4, reply, 4); + if (res < 0) + return res; + if (res != 2) { + FN_WARNING("send_cmd returned %d [%04x %04x], 0000 expected\n", res, reply[0], reply[1]); + } + return 0; +} + +int freenect_start_depth(freenect_device *dev) +{ + freenect_context *ctx = dev->parent; + int res; + + if (dev->depth.running) + return -1; + + switch (dev->depth_format) { + case FREENECT_DEPTH_11BIT: + stream_initbufs(ctx, &dev->depth, FREENECT_DEPTH_11BIT_PACKED_SIZE, FREENECT_DEPTH_11BIT_SIZE); + dev->depth.pkts_per_frame = DEPTH_PKTS_11_BIT_PER_FRAME; + break; + case FREENECT_DEPTH_10BIT: + stream_initbufs(ctx, &dev->depth, FREENECT_DEPTH_10BIT_PACKED_SIZE, FREENECT_DEPTH_10BIT_SIZE); + dev->depth.pkts_per_frame = DEPTH_PKTS_10_BIT_PER_FRAME; + break; + case FREENECT_DEPTH_11BIT_PACKED: + stream_initbufs(ctx, &dev->depth, 0, FREENECT_DEPTH_11BIT_PACKED_SIZE); + dev->depth.pkts_per_frame = DEPTH_PKTS_11_BIT_PER_FRAME; + break; + case FREENECT_DEPTH_10BIT_PACKED: + stream_initbufs(ctx, &dev->depth, 0, FREENECT_DEPTH_11BIT_PACKED_SIZE); + dev->depth.pkts_per_frame = DEPTH_PKTS_10_BIT_PER_FRAME; + break; + } + + dev->depth.pkt_size = DEPTH_PKTDSIZE; + dev->depth.synced = 0; + dev->depth.flag = 0x70; + dev->depth.valid_frames = 0; + + res = fnusb_start_iso(&dev->usb_cam, &dev->depth_isoc, depth_process, 0x82, NUM_XFERS, PKTS_PER_XFER, DEPTH_PKTBUF); + if (res < 0) + return res; + + write_register(dev, 0x06, 0x00); // reset depth stream + switch (dev->depth_format) { + case FREENECT_DEPTH_11BIT: + case FREENECT_DEPTH_11BIT_PACKED: + write_register(dev, 0x12, 0x03); + break; + case FREENECT_DEPTH_10BIT: + case FREENECT_DEPTH_10BIT_PACKED: + write_register(dev, 0x12, 0x02); + break; + } + write_register(dev, 0x13, 0x01); + write_register(dev, 0x14, 0x1e); + write_register(dev, 0x06, 0x02); // start depth stream + + dev->depth.running = 1; + return 0; +} + +int freenect_start_video(freenect_device *dev) +{ + freenect_context *ctx = dev->parent; + int res; + + if (dev->video.running) + return -1; + + switch (dev->video_format) { + case FREENECT_VIDEO_RGB: + stream_initbufs(ctx, &dev->video, FREENECT_VIDEO_BAYER_SIZE, FREENECT_VIDEO_RGB_SIZE); + dev->video.pkts_per_frame = VIDEO_PKTS_PER_FRAME; + break; + case FREENECT_VIDEO_BAYER: + stream_initbufs(ctx, &dev->video, 0, FREENECT_VIDEO_BAYER_SIZE); + dev->video.pkts_per_frame = VIDEO_PKTS_PER_FRAME; + break; + case FREENECT_VIDEO_IR_8BIT: + stream_initbufs(ctx, &dev->video, FREENECT_VIDEO_IR_10BIT_PACKED_SIZE, FREENECT_VIDEO_IR_8BIT_SIZE); + dev->video.pkts_per_frame = VIDEO_PKTS_PER_FRAME_IR; + break; + case FREENECT_VIDEO_IR_10BIT: + stream_initbufs(ctx, &dev->video, FREENECT_VIDEO_IR_10BIT_PACKED_SIZE, FREENECT_VIDEO_BAYER_SIZE); + dev->video.pkts_per_frame = VIDEO_PKTS_PER_FRAME_IR; + break; + case FREENECT_VIDEO_IR_10BIT_PACKED: + stream_initbufs(ctx, &dev->video, 0, FREENECT_VIDEO_IR_10BIT_PACKED_SIZE); + dev->video.pkts_per_frame = VIDEO_PKTS_PER_FRAME_IR; + break; + } + + dev->video.pkt_size = VIDEO_PKTDSIZE; + dev->video.synced = 0; + dev->video.flag = 0x80; + dev->video.valid_frames = 0; + + res = fnusb_start_iso(&dev->usb_cam, &dev->video_isoc, video_process, 0x81, NUM_XFERS, PKTS_PER_XFER, VIDEO_PKTBUF); + if (res < 0) + return res; + + write_register(dev, 0x05, 0x00); // reset video stream + write_register(dev, 0x0c, 0x00); + write_register(dev, 0x0d, 0x01); + write_register(dev, 0x0e, 0x1e); // 30Hz bayer + switch (dev->video_format) { + case FREENECT_VIDEO_RGB: + case FREENECT_VIDEO_BAYER: + write_register(dev, 0x05, 0x01); // start video stream + break; + case FREENECT_VIDEO_IR_8BIT: + case FREENECT_VIDEO_IR_10BIT: + case FREENECT_VIDEO_IR_10BIT_PACKED: + write_register(dev, 0x05, 0x03); // start video stream + break; + } + write_register(dev, 0x47, 0x00); // disable Hflip + + dev->video.running = 1; + return 0; +} + +int freenect_stop_depth(freenect_device *dev) +{ + freenect_context *ctx = dev->parent; + int res; + + if (!dev->depth.running) + return -1; + + dev->depth.running = 0; + write_register(dev, 0x06, 0x00); // stop depth stream + + res = fnusb_stop_iso(&dev->usb_cam, &dev->depth_isoc); + if (res < 0) { + FN_ERROR("Failed to stop depth isochronous stream: %d\n", res); + return res; + } + + stream_freebufs(ctx, &dev->depth); + return 0; +} + +int freenect_stop_video(freenect_device *dev) +{ + freenect_context *ctx = dev->parent; + int res; + + if (!dev->video.running) + return -1; + + dev->video.running = 0; + write_register(dev, 0x05, 0x00); // stop video stream + + res = fnusb_stop_iso(&dev->usb_cam, &dev->video_isoc); + if (res < 0) { + FN_ERROR("Failed to stop RGB isochronous stream: %d\n", res); + return res; + } + + stream_freebufs(ctx, &dev->video); + return 0; +} + +void freenect_set_depth_callback(freenect_device *dev, freenect_depth_cb cb) +{ + dev->depth_cb = cb; +} + +void freenect_set_video_callback(freenect_device *dev, freenect_video_cb cb) +{ + dev->video_cb = cb; +} + +int freenect_set_video_format(freenect_device *dev, freenect_video_format fmt) +{ + freenect_context *ctx = dev->parent; + if (dev->video.running) { + FN_ERROR("Tried to set video format while stream is active\n"); + return -1; + } + + switch (fmt) { + case FREENECT_VIDEO_RGB: + case FREENECT_VIDEO_BAYER: + case FREENECT_VIDEO_IR_8BIT: + case FREENECT_VIDEO_IR_10BIT: + case FREENECT_VIDEO_IR_10BIT_PACKED: + dev->video_format = fmt; + return 0; + default: + FN_ERROR("Invalid video format %d\n", fmt); + return -1; + } +} + +int freenect_set_depth_format(freenect_device *dev, freenect_depth_format fmt) +{ + freenect_context *ctx = dev->parent; + if (dev->depth.running) { + FN_ERROR("Tried to set depth format while stream is active\n"); + return -1; + } + switch (fmt) { + case FREENECT_DEPTH_11BIT: + case FREENECT_DEPTH_10BIT: + case FREENECT_DEPTH_11BIT_PACKED: + case FREENECT_DEPTH_10BIT_PACKED: + dev->depth_format = fmt; + return 0; + default: + FN_ERROR("Invalid depth format %d\n", fmt); + return -1; + } + return 0; +} + +int freenect_set_depth_buffer(freenect_device *dev, void *buf) +{ + return stream_setbuf(dev->parent, &dev->depth, buf); +} + +int freenect_set_video_buffer(freenect_device *dev, void *buf) +{ + return stream_setbuf(dev->parent, &dev->video, buf); +} diff --git a/KinectJNI_v0002/src/libfreenect/core.c b/KinectJNI_v0002/src/libfreenect/core.c new file mode 100644 index 0000000..eeb2ea2 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/core.c @@ -0,0 +1,197 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#include +#include +#include +#include +#include + +#include "freenect_internal.h" + +int freenect_init(freenect_context **ctx, freenect_usb_context *usb_ctx) +{ + *ctx = malloc(sizeof(freenect_context)); + if (!ctx) + return -1; + + memset(*ctx, 0, sizeof(freenect_context)); + + (*ctx)->log_level = LL_WARNING; + return fnusb_init(&(*ctx)->usb, usb_ctx); +} + +int freenect_shutdown(freenect_context *ctx) +{ + while (ctx->first) { + FN_NOTICE("Device %p open during shutdown, closing...\n", ctx->first); + freenect_close_device(ctx->first); + } + + fnusb_shutdown(&ctx->usb); + free(ctx); + return 0; +} + +int freenect_process_events(freenect_context *ctx) +{ + return fnusb_process_events(&ctx->usb); +} + +int freenect_num_devices(freenect_context *ctx) +{ + libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices + ssize_t cnt = libusb_get_device_list (ctx->usb.ctx, &devs); //get the list of devices + + if (cnt < 0) + return (-1); + + int nr = 0, i = 0; + struct libusb_device_descriptor desc; + for (i = 0; i < cnt; ++i) + { + int r = libusb_get_device_descriptor (devs[i], &desc); + if (r < 0) + continue; + if (desc.idVendor == VID_MICROSOFT && desc.idProduct == PID_NUI_CAMERA) + nr++; + } + + libusb_free_device_list (devs, 1); // free the list, unref the devices in it + + return (nr); +} + +int freenect_open_device(freenect_context *ctx, freenect_device **dev, int index) +{ + int res; + freenect_device *pdev = malloc(sizeof(freenect_device)); + if (!pdev) + return -1; + + memset(pdev, 0, sizeof(*pdev)); + + pdev->parent = ctx; + + res = fnusb_open_subdevices(pdev, index); + + if (res < 0) { + free(pdev); + return res; + } + + if (!ctx->first) { + ctx->first = pdev; + } else { + freenect_device *prev = ctx->first; + while (prev->next) + prev = prev->next; + prev->next = pdev; + } + + *dev = pdev; + return 0; +} + +int freenect_close_device(freenect_device *dev) +{ + freenect_context *ctx = dev->parent; + int res; + + // stop streams, if active + freenect_stop_depth(dev); + freenect_stop_video(dev); + + res = fnusb_close_subdevices(dev); + if (res < 0) { + FN_ERROR("fnusb_close_subdevices failed: %d\n", res); + return res; + } + + freenect_device *last = NULL; + freenect_device *cur = ctx->first; + + while (cur && cur != dev) { + last = cur; + cur = cur->next; + } + + if (!cur) { + FN_ERROR("device %p not found in linked list for this context!\n", dev); + return -1; + } + + if (last) + last->next = cur->next; + else + ctx->first = cur->next; + + free(dev); + return 0; +} + +void freenect_set_user(freenect_device *dev, void *user) +{ + dev->user_data = user; +} + +void *freenect_get_user(freenect_device *dev) +{ + return dev->user_data; +} + +void freenect_set_log_level(freenect_context *ctx, freenect_loglevel level) +{ + ctx->log_level = level; +} + +void freenect_set_log_callback(freenect_context *ctx, freenect_log_cb cb) +{ + ctx->log_cb = cb; +} + +void fn_log(freenect_context *ctx, freenect_loglevel level, const char *fmt, ...) +{ + va_list ap; + + if (level > ctx->log_level) + return; + + if (ctx->log_cb) { + char msgbuf[1024]; + + va_start(ap, fmt); + vsnprintf(msgbuf, 1024, fmt, ap); + msgbuf[1023] = 0; + va_end(ap); + + ctx->log_cb(ctx, level, msgbuf); + } else { + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + } +} diff --git a/KinectJNI_v0002/src/libfreenect/freenect_internal.h b/KinectJNI_v0002/src/libfreenect/freenect_internal.h new file mode 100644 index 0000000..504a5b8 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/freenect_internal.h @@ -0,0 +1,156 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#ifndef FREENECT_INTERNAL_H +#define FREENECT_INTERNAL_H + +#include + +#include "libfreenect.h" + +typedef void (*fnusb_iso_cb)(freenect_device *dev, uint8_t *buf, int len); + +#include "usb_libusb10.h" + +struct _freenect_context { + freenect_loglevel log_level; + freenect_log_cb log_cb; + fnusb_ctx usb; + freenect_device *first; +}; + +#define LL_FATAL FREENECT_LOG_FATAL +#define LL_ERROR FREENECT_LOG_ERROR +#define LL_WARNING FREENECT_LOG_WARNING +#define LL_NOTICE FREENECT_LOG_NOTICE +#define LL_INFO FREENECT_LOG_INFO +#define LL_DEBUG FREENECT_LOG_DEBUG +#define LL_SPEW FREENECT_LOG_SPEW +#define LL_FLOOD FREENECT_LOG_FLOOD + +void fn_log(freenect_context *ctx, freenect_loglevel level, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); + +#define FN_LOG(level, ...) fn_log(ctx, level, __VA_ARGS__) + +#define FN_FATAL(...) FN_LOG(LL_FATAL, __VA_ARGS__) +#define FN_ERROR(...) FN_LOG(LL_ERROR, __VA_ARGS__) +#define FN_WARNING(...) FN_LOG(LL_WARNING, __VA_ARGS__) +#define FN_NOTICE(...) FN_LOG(LL_NOTICE, __VA_ARGS__) +#define FN_INFO(...) FN_LOG(LL_INFO, __VA_ARGS__) +#define FN_DEBUG(...) FN_LOG(LL_DEBUG, __VA_ARGS__) +#define FN_SPEW(...) FN_LOG(LL_SPEW, __VA_ARGS__) +#define FN_FLOOD(...) FN_LOG(LL_FLOOD, __VA_ARGS__) + +#ifdef FN_BIGENDIAN +static inline uint16_t fn_le16(uint16_t d) +{ + return (d<<8) | (d>>8); +} +static inline uint32_t fn_le32(uint32_t d) +{ + return (d<<24) | ((d<<8)&0xFF0000) | ((d>>8)&0xFF00) | (d>>24); +} +#else +#define fn_le16(x) (x) +#define fn_le32(x) (x) +#endif + +#define FRAME_H FREENECT_FRAME_H +#define FRAME_W FREENECT_FRAME_W +#define FRAME_PIX FREENECT_FRAME_PIX + +#define DEPTH_PKTSIZE 1760 +#define VIDEO_PKTSIZE 1920 + +#define DEPTH_PKTDSIZE (DEPTH_PKTSIZE-12) +#define VIDEO_PKTDSIZE (VIDEO_PKTSIZE-12) + +#define DEPTH_PKTS_10_BIT_PER_FRAME ((FREENECT_DEPTH_10BIT_PACKED_SIZE+DEPTH_PKTDSIZE-1)/DEPTH_PKTDSIZE) +#define DEPTH_PKTS_11_BIT_PER_FRAME ((FREENECT_DEPTH_11BIT_PACKED_SIZE+DEPTH_PKTDSIZE-1)/DEPTH_PKTDSIZE) +#define VIDEO_PKTS_PER_FRAME ((FRAME_PIX+VIDEO_PKTDSIZE-1)/VIDEO_PKTDSIZE) +#define VIDEO_PKTS_PER_FRAME_IR ((FREENECT_VIDEO_IR_10BIT_PACKED_SIZE+VIDEO_PKTDSIZE-1)/VIDEO_PKTDSIZE) + +#define VID_MICROSOFT 0x45e +#define PID_NUI_CAMERA 0x02ae +#define PID_NUI_MOTOR 0x02b0 + +typedef struct { + int running; + uint8_t flag; + int synced; + uint8_t seq; + int got_pkts; + int pkt_num; + int pkts_per_frame; + int pkt_size; + int valid_pkts; + int valid_frames; + uint32_t last_timestamp; + uint32_t timestamp; + int split_bufs; + void *lib_buf; + void *usr_buf; + uint8_t *raw_buf; + void *proc_buf; +} packet_stream; + +struct _freenect_device { + freenect_context *parent; + freenect_device *next; + void *user_data; + + // Cameras + fnusb_dev usb_cam; + fnusb_isoc_stream depth_isoc; + fnusb_isoc_stream video_isoc; + + freenect_depth_cb depth_cb; + freenect_video_cb video_cb; + freenect_video_format video_format; + freenect_depth_format depth_format; + + int cam_inited; + uint16_t cam_tag; + + packet_stream depth; + packet_stream video; + + // Audio + // Motor + fnusb_dev usb_motor; + freenect_raw_tilt_state raw_state; +}; + +struct caminit { + uint16_t command; + uint16_t tag; + int cmdlen; + int replylen; + uint8_t cmddata[1024]; + uint8_t replydata[1024]; +}; + +#endif diff --git a/KinectJNI_v0002/src/libfreenect/libfreenect.h b/KinectJNI_v0002/src/libfreenect/libfreenect.h new file mode 100644 index 0000000..ef27b81 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/libfreenect.h @@ -0,0 +1,164 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#ifndef LIBFREENECT_H +#define LIBFREENECT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define FREENECT_FRAME_W 640 +#define FREENECT_FRAME_H 480 +#define FREENECT_FRAME_PIX (FREENECT_FRAME_H*FREENECT_FRAME_W) + +#define FREENECT_IR_FRAME_W 640 +#define FREENECT_IR_FRAME_H 488 +#define FREENECT_IR_FRAME_PIX (FREENECT_IR_FRAME_H*FREENECT_IR_FRAME_W) + +#define FREENECT_VIDEO_RGB_SIZE (FREENECT_FRAME_PIX*3) +#define FREENECT_VIDEO_BAYER_SIZE (FREENECT_FRAME_PIX) +#define FREENECT_VIDEO_IR_8BIT_SIZE (FREENECT_IR_FRAME_PIX) +#define FREENECT_VIDEO_IR_10BIT_SIZE (FREENECT_IR_FRAME_PIX*sizeof(uint16_t)) +#define FREENECT_VIDEO_IR_10BIT_PACKED_SIZE 390400 + +#define FREENECT_DEPTH_11BIT_SIZE (FREENECT_FRAME_PIX*sizeof(uint16_t)) +#define FREENECT_DEPTH_10BIT_SIZE FREENECT_DEPTH_11BIT_SIZE +#define FREENECT_DEPTH_11BIT_PACKED_SIZE 422400 +#define FREENECT_DEPTH_10BIT_PACKED_SIZE 384000 + +#define FREENECT_COUNTS_PER_G 819 + +typedef enum { + FREENECT_VIDEO_RGB = 0, + FREENECT_VIDEO_BAYER = 1, + FREENECT_VIDEO_IR_8BIT = 2, + FREENECT_VIDEO_IR_10BIT = 3, + FREENECT_VIDEO_IR_10BIT_PACKED = 4, +} freenect_video_format; + +typedef enum { + LED_OFF = 0, + LED_GREEN = 1, + LED_RED = 2, + LED_YELLOW = 3, + LED_BLINK_YELLOW = 4, + LED_BLINK_GREEN = 5, + LED_BLINK_RED_YELLOW = 6 +} freenect_led_options; + +typedef enum { + FREENECT_DEPTH_11BIT = 0, + FREENECT_DEPTH_10BIT = 1, + FREENECT_DEPTH_11BIT_PACKED = 2, + FREENECT_DEPTH_10BIT_PACKED = 3, +} freenect_depth_format; + +typedef enum { + TILT_STATUS_STOPPED = 0x00, + TILT_STATUS_LIMIT = 0x01, + TILT_STATUS_MOVING = 0x04 +} freenect_tilt_status_code; + +typedef struct { + int16_t accelerometer_x; + int16_t accelerometer_y; + int16_t accelerometer_z; + int8_t tilt_angle; + freenect_tilt_status_code tilt_status; +} freenect_raw_tilt_state; + +struct _freenect_context; +typedef struct _freenect_context freenect_context; + +struct _freenect_device; +typedef struct _freenect_device freenect_device; + +// usb backend specific section +#include "libusb.h" +typedef libusb_context freenect_usb_context; +// + +typedef enum { + FREENECT_LOG_FATAL = 0, + FREENECT_LOG_ERROR, + FREENECT_LOG_WARNING, + FREENECT_LOG_NOTICE, + FREENECT_LOG_INFO, + FREENECT_LOG_DEBUG, + FREENECT_LOG_SPEW, + FREENECT_LOG_FLOOD, +} freenect_loglevel; + +int freenect_init(freenect_context **ctx, freenect_usb_context *usb_ctx); +int freenect_shutdown(freenect_context *ctx); + +typedef void (*freenect_log_cb)(freenect_context *dev, freenect_loglevel level, const char *msg); + +void freenect_set_log_level(freenect_context *ctx, freenect_loglevel level); +void freenect_set_log_callback(freenect_context *ctx, freenect_log_cb cb); + +int freenect_process_events(freenect_context *ctx); + +int freenect_num_devices(freenect_context *ctx); +int freenect_open_device(freenect_context *ctx, freenect_device **dev, int index); +int freenect_close_device(freenect_device *dev); + +void freenect_set_user(freenect_device *dev, void *user); +void *freenect_get_user(freenect_device *dev); + +typedef void (*freenect_depth_cb)(freenect_device *dev, void *depth, uint32_t timestamp); +typedef void (*freenect_video_cb)(freenect_device *dev, void *video, uint32_t timestamp); + +void freenect_set_depth_callback(freenect_device *dev, freenect_depth_cb cb); +void freenect_set_video_callback(freenect_device *dev, freenect_video_cb cb); + +int freenect_set_depth_format(freenect_device *dev, freenect_depth_format fmt); +int freenect_set_video_format(freenect_device *dev, freenect_video_format fmt); + +int freenect_set_depth_buffer(freenect_device *dev, void *buf); +int freenect_set_video_buffer(freenect_device *dev, void *buf); + +int freenect_start_depth(freenect_device *dev); +int freenect_start_video(freenect_device *dev); +int freenect_stop_depth(freenect_device *dev); +int freenect_stop_video(freenect_device *dev); + +int freenect_update_tilt_state(freenect_device *dev); +freenect_raw_tilt_state* freenect_get_tilt_state(freenect_device *dev); +double freenect_get_tilt_degs(freenect_raw_tilt_state *state); +int freenect_set_tilt_degs(freenect_device *dev, double angle); +int freenect_set_led(freenect_device *dev, freenect_led_options option); +void freenect_get_mks_accel(freenect_raw_tilt_state *state, double* x, double* y, double* z); + +#ifdef __cplusplus +} +#endif + +#endif // + diff --git a/KinectJNI_v0002/src/libfreenect/libfreenect.hpp b/KinectJNI_v0002/src/libfreenect/libfreenect.hpp new file mode 100644 index 0000000..4189d01 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/libfreenect.hpp @@ -0,0 +1,155 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#pragma once + +#include +#include +#include +#include + +namespace Freenect { + class Noncopyable { + public: + Noncopyable() {} + ~Noncopyable() {} + private: + Noncopyable( const Noncopyable& ); + const Noncopyable& operator=( const Noncopyable& ); + }; + + class FreenectDeviceState { + friend class FreenectDevice; + FreenectDeviceState(freenect_raw_tilt_state *_state): + m_state(_state) + {} + public: + void getAccelerometers(double* x, double* y, double* z) { + freenect_get_mks_accel(m_state, x, y, z); + } + double getTiltDegs() { + return freenect_get_tilt_degs(m_state); + } + private: + freenect_raw_tilt_state *m_state; + }; + + class FreenectDevice : Noncopyable { + public: + FreenectDevice(freenect_context *_ctx, int _index) { + if(freenect_open_device(_ctx, &m_dev, _index) != 0) throw std::runtime_error("Cannot open Kinect"); + freenect_set_user(m_dev, this); + freenect_set_video_format(m_dev, FREENECT_VIDEO_RGB); + freenect_set_depth_format(m_dev, FREENECT_DEPTH_11BIT); + freenect_set_depth_callback(m_dev, freenect_depth_callback); + freenect_set_video_callback(m_dev, freenect_video_callback); + } + ~FreenectDevice() { + if(freenect_close_device(m_dev) != 0) throw std::runtime_error("Cannot shutdown Kinect"); + } + void startVideo() { + if(freenect_start_video(m_dev) != 0) throw std::runtime_error("Cannot start RGB callback"); + } + void stopVideo() { + if(freenect_stop_video(m_dev) != 0) throw std::runtime_error("Cannot stop RGB callback"); + } + void startDepth() { + if(freenect_start_depth(m_dev) != 0) throw std::runtime_error("Cannot start depth callback"); + } + void stopDepth() { + if(freenect_stop_depth(m_dev) != 0) throw std::runtime_error("Cannot stop depth callback"); + } + void setTiltDegrees(double _angle) { + if(freenect_set_tilt_degs(m_dev, _angle) != 0) throw std::runtime_error("Cannot set angle in degrees"); + } + void setLed(freenect_led_options _option) { + if(freenect_set_led(m_dev, _option) != 0) throw std::runtime_error("Cannot set led"); + } + void updateState() { + if (freenect_update_tilt_state(m_dev) != 0) throw std::runtime_error("Cannot update device state"); + } + FreenectDeviceState getState() const { + return FreenectDeviceState(freenect_get_tilt_state(m_dev)); + } + // Do not call directly even in child + virtual void VideoCallback(void *video, uint32_t timestamp) = 0; + // Do not call directly even in child + virtual void DepthCallback(void *depth, uint32_t timestamp) = 0; + private: + freenect_device *m_dev; + static void freenect_depth_callback(freenect_device *dev, void *depth, uint32_t timestamp) { + FreenectDevice* device = static_cast(freenect_get_user(dev)); + device->DepthCallback(depth, timestamp); + } + static void freenect_video_callback(freenect_device *dev, void *video, uint32_t timestamp) { + FreenectDevice* device = static_cast(freenect_get_user(dev)); + device->VideoCallback(video, timestamp); + } + }; + + template class Freenect : Noncopyable { + public: + Freenect() : m_stop(false) { + if(freenect_init(&m_ctx, NULL) != 0) throw std::runtime_error("Cannot initialize freenect library"); + if(pthread_create(&m_thread, NULL, pthread_callback, (void*)this) != 0) throw std::runtime_error("Cannot initialize freenect thread"); + } + ~Freenect() { + for(typename std::map::iterator it = m_devices.begin() ; it != m_devices.end() ; ++it) { + delete it->second; + } + m_stop = true; + pthread_join(m_thread, NULL); + if(freenect_shutdown(m_ctx) != 0) throw std::runtime_error("Cannot cleanup freenect library"); + } + T& createDevice(int _index) { + m_devices.insert(std::make_pair(_index, new T(m_ctx, _index))); + return *(m_devices.at(_index)); + } + void deleteDevice(int _index) { + m_devices.erase(_index); + } + int deviceCount() { + return freenect_num_devices(m_ctx); + } + // Do not call directly, thread runs here + void operator()() { + while(!m_stop) { + if(freenect_process_events(m_ctx) != 0) throw std::runtime_error("Cannot process freenect events"); + } + } + static void *pthread_callback(void *user_data) { + Freenect* freenect = static_cast*>(user_data); + (*freenect)(); + } + private: + freenect_context *m_ctx; + volatile bool m_stop; + pthread_t m_thread; + std::map m_devices; + }; + +} + diff --git a/KinectJNI_v0002/src/libfreenect/libfreenect.pc.in b/KinectJNI_v0002/src/libfreenect/libfreenect.pc.in new file mode 100644 index 0000000..2e21899 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/libfreenect.pc.in @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/@PROJECT_LIBRARY_INSTALL_DIR@ +includedir=${prefix}/@PROJECT_INCLUDE_INSTALL_DIR@ + +Name: @CMAKE_PROJECT_NAME@ +Description: Interface to the Microsoft Kinect sensor device. +Requires: libusb-1.0 +Version: @PROJECT_APIVER@ +Libs: -L${libdir} -lfreenect +Cflags: -I${includedir} diff --git a/KinectJNI_v0002/src/libfreenect/tilt.c b/KinectJNI_v0002/src/libfreenect/tilt.c new file mode 100644 index 0000000..6892e56 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/tilt.c @@ -0,0 +1,103 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#include +#include +#include +#include +#include + +#include "freenect_internal.h" + +// The kinect can tilt from +31 to -31 degrees in what looks like 1 degree increments +// The control input looks like 2*desired_degrees +#define MAX_TILT_ANGLE 31 +#define MIN_TILT_ANGLE (-31) + +#define GRAVITY 9.80665 + +freenect_raw_tilt_state* freenect_get_tilt_state(freenect_device *dev) +{ + return &dev->raw_state; +} + +int freenect_update_tilt_state(freenect_device *dev) +{ + freenect_context *ctx = dev->parent; + uint8_t buf[10]; + uint16_t ux, uy, uz; + int ret = fnusb_control(&dev->usb_motor, 0xC0, 0x32, 0x0, 0x0, buf, 10); + if (ret != 10) { + FN_ERROR("Error in accelerometer reading, libusb_control_transfer returned %d\n", ret); + return ret < 0 ? ret : -1; + } + + ux = ((uint16_t)buf[2] << 8) | buf[3]; + uy = ((uint16_t)buf[4] << 8) | buf[5]; + uz = ((uint16_t)buf[6] << 8) | buf[7]; + + dev->raw_state.accelerometer_x = (int16_t)ux; + dev->raw_state.accelerometer_y = (int16_t)uy; + dev->raw_state.accelerometer_z = (int16_t)uz; + dev->raw_state.tilt_angle = (int8_t)buf[8]; + dev->raw_state.tilt_status = buf[9]; + + return ret; +} + +int freenect_set_tilt_degs(freenect_device *dev, double angle) +{ + int ret; + uint8_t empty[0x1]; + + angle = (angleMAX_TILT_ANGLE) ? MAX_TILT_ANGLE : angle); + angle = angle * 2; + + ret = fnusb_control(&dev->usb_motor, 0x40, 0x31, (uint16_t)angle, 0x0, empty, 0x0); + return ret; +} + +int freenect_set_led(freenect_device *dev, freenect_led_options option) +{ + int ret; + uint8_t empty[0x1]; + ret = fnusb_control(&dev->usb_motor, 0x40, 0x06, (uint16_t)option, 0x0, empty, 0x0); + return ret; +} + +double freenect_get_tilt_degs(freenect_raw_tilt_state *state) +{ + return ((double)state->tilt_angle) / 2.; +} + +void freenect_get_mks_accel(freenect_raw_tilt_state *state, double* x, double* y, double* z) +{ + //the documentation for the accelerometer (http://www.kionix.com/Product%20Sheets/KXSD9%20Product%20Brief.pdf) + //states there are 819 counts/g + *x = (double)state->accelerometer_x/FREENECT_COUNTS_PER_G*GRAVITY; + *y = (double)state->accelerometer_y/FREENECT_COUNTS_PER_G*GRAVITY; + *z = (double)state->accelerometer_z/FREENECT_COUNTS_PER_G*GRAVITY; +} diff --git a/KinectJNI_v0002/src/libfreenect/usb_libusb10.c b/KinectJNI_v0002/src/libfreenect/usb_libusb10.c new file mode 100644 index 0000000..0052190 --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/usb_libusb10.c @@ -0,0 +1,261 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#include +#include +#include +#include +#include "libusb.h" +#include "freenect_internal.h" + +int fnusb_init(fnusb_ctx *ctx, freenect_usb_context *usb_ctx) +{ + int res; + if (!usb_ctx) { + res = libusb_init(&ctx->ctx); + if (res >= 0) { + ctx->should_free_ctx = 1; + return 0; + } else { + ctx->should_free_ctx = 0; + ctx->ctx = NULL; + return res; + } + } else { + ctx->ctx = usb_ctx; + ctx->should_free_ctx = 0; + return 0; + } +} + +int fnusb_shutdown(fnusb_ctx *ctx) +{ + //int res; + if (ctx->should_free_ctx) { + libusb_exit(ctx->ctx); + ctx->ctx = NULL; + } + return 0; +} + +int fnusb_process_events(fnusb_ctx *ctx) +{ + return libusb_handle_events(ctx->ctx); +} + +int fnusb_open_subdevices(freenect_device *dev, int index) +{ + freenect_context *ctx = dev->parent; + + dev->usb_cam.parent = dev; + dev->usb_cam.dev = NULL; + dev->usb_motor.parent = dev; + dev->usb_motor.dev = NULL; + + libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices + ssize_t cnt = libusb_get_device_list (dev->parent->usb.ctx, &devs); //get the list of devices + if (cnt < 0) + return -1; + + int i = 0, nr_cam = 0, nr_mot = 0; + int res; + struct libusb_device_descriptor desc; + + for (i = 0; i < cnt; i++) { + int r = libusb_get_device_descriptor (devs[i], &desc); + if (r < 0) + continue; + + if (desc.idVendor != VID_MICROSOFT) + continue; + + // Search for the camera + if (!dev->usb_cam.dev && desc.idProduct == PID_NUI_CAMERA) { + // If the index given by the user matches our camera index + if (nr_cam == index) { + res = libusb_open (devs[i], &dev->usb_cam.dev); + if (res < 0 || !dev->usb_cam.dev) { + FN_ERROR("Could not open camera: %d\n", res); + dev->usb_cam.dev = NULL; + break; + } + res = libusb_claim_interface (dev->usb_cam.dev, 0); + if (res < 0) { + FN_ERROR("Could not claim interface on camera: %d\n", res); + libusb_close(dev->usb_cam.dev); + dev->usb_cam.dev = NULL; + break; + } + } else { + nr_cam++; + } + } + + // Search for the motor + if (!dev->usb_motor.dev && desc.idProduct == PID_NUI_MOTOR) { + // If the index given by the user matches our camera index + if (nr_mot == index) { + res = libusb_open (devs[i], &dev->usb_motor.dev); + if (res < 0 || !dev->usb_motor.dev) { + FN_ERROR("Could not open motor: %d\n", res); + dev->usb_motor.dev = NULL; + break; + } + res = libusb_claim_interface (dev->usb_motor.dev, 0); + if (res < 0) { + FN_ERROR("Could not claim interface on motor: %d\n", res); + libusb_close(dev->usb_motor.dev); + dev->usb_motor.dev = NULL; + break; + } + } else { + nr_mot++; + } + } + } + + libusb_free_device_list (devs, 1); // free the list, unref the devices in it + + if (dev->usb_cam.dev && dev->usb_motor.dev) { + return 0; + } else { + if (dev->usb_cam.dev) { + libusb_release_interface(dev->usb_cam.dev, 0); + libusb_close(dev->usb_cam.dev); + } + if (dev->usb_motor.dev) { + libusb_release_interface(dev->usb_motor.dev, 0); + libusb_close(dev->usb_motor.dev); + } + return -1; + } +} + +int fnusb_close_subdevices(freenect_device *dev) +{ + if (dev->usb_cam.dev) { + libusb_release_interface(dev->usb_cam.dev, 0); + libusb_close(dev->usb_cam.dev); + dev->usb_cam.dev = NULL; + } + if (dev->usb_motor.dev) { + libusb_release_interface(dev->usb_motor.dev, 0); + libusb_close(dev->usb_motor.dev); + dev->usb_motor.dev = NULL; + } + return 0; +} + +static void iso_callback(struct libusb_transfer *xfer) +{ + int i; + fnusb_isoc_stream *strm = xfer->user_data; + + if (strm->dead) { + freenect_context *ctx = strm->parent->parent->parent; + strm->dead_xfers++; + FN_SPEW("EP %02x transfer complete, %d left\n", xfer->endpoint, strm->num_xfers - strm->dead_xfers); + return; + } + + if(xfer->status == LIBUSB_TRANSFER_COMPLETED) { + uint8_t *buf = (void*)xfer->buffer; + for (i=0; ipkts; i++) { + strm->cb(strm->parent->parent, buf, xfer->iso_packet_desc[i].actual_length); + buf += strm->len; + } + libusb_submit_transfer(xfer); + } else { + freenect_context *ctx = strm->parent->parent->parent; + FN_WARNING("Isochronous transfer error: %d\n", xfer->status); + strm->dead_xfers++; + } +} + +int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_iso_cb cb, int ep, int xfers, int pkts, int len) +{ + freenect_context *ctx = dev->parent->parent; + int ret, i; + + strm->parent = dev; + strm->cb = cb; + strm->num_xfers = xfers; + strm->pkts = pkts; + strm->len = len; + strm->buffer = malloc(xfers * pkts * len); + strm->xfers = malloc(sizeof(struct libusb_transfer*) * xfers); + strm->dead = 0; + strm->dead_xfers = 0; + + uint8_t *bufp = strm->buffer; + + for (i=0; ixfers[i] = libusb_alloc_transfer(pkts); + + libusb_fill_iso_transfer(strm->xfers[i], dev->dev, ep, bufp, pkts * len, pkts, iso_callback, strm, 0); + + libusb_set_iso_packet_lengths(strm->xfers[i], len); + + ret = libusb_submit_transfer(strm->xfers[i]); + if (ret < 0) + FN_WARNING("Failed to submit isochronous transfer %d: %d\n", i, ret); + + bufp += pkts*len; + } + + return 0; + +} + +int fnusb_stop_iso(fnusb_dev *dev, fnusb_isoc_stream *strm) +{ + freenect_context *ctx = dev->parent->parent; + int i; + + strm->dead = 1; + + for (i=0; inum_xfers; i++) + libusb_cancel_transfer(strm->xfers[i]); + + while (strm->dead_xfers < strm->num_xfers) { + libusb_handle_events(ctx->usb.ctx); + } + + for (i=0; inum_xfers; i++) + libusb_free_transfer(strm->xfers[i]); + + free(strm->buffer); + free(strm->xfers); + + memset(strm, 0, sizeof(*strm)); + return 0; +} + +int fnusb_control(fnusb_dev *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength) +{ + return libusb_control_transfer(dev->dev, bmRequestType, bRequest, wValue, wIndex, data, wLength, 0); +} diff --git a/KinectJNI_v0002/src/libfreenect/usb_libusb10.h b/KinectJNI_v0002/src/libfreenect/usb_libusb10.h new file mode 100644 index 0000000..c7fde0b --- /dev/null +++ b/KinectJNI_v0002/src/libfreenect/usb_libusb10.h @@ -0,0 +1,93 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#ifndef USB_LIBUSB10 +#define USB_LIBUSB10 + +#include "libusb.h" + +#if defined(__APPLE__) +/* + From Github Issue 22 by Roefer - + https://github.com/OpenKinect/libfreenect/issues/#issue/22 + + The current implementation still does not reach 30 Hz on MacOS. This + is due to bad scheduling of USB transfers in libusb (Ed Note: libusb + 1.0.8). A fix can be found at + http://www.informatik.uni-bremen.de/~roefer/libusb/libusb-osx-kinect.diff + + (Ed Note: patch applies to libusb repo at 7da756e09fd) + + In camera.c, I use PKTS_PER_XFER = 128, NUM_XFERS = 4. There are a + few rules: PKTS_PER_XFER * NUM_XFERS <= 1000, PKTS_PER_XFER % 8 == 0. +*/ +#define PKTS_PER_XFER 128 +#define NUM_XFERS 4 +#define DEPTH_PKTBUF 2048 +#define VIDEO_PKTBUF 2048 +#else +#define PKTS_PER_XFER 16 +#define NUM_XFERS 16 +#define DEPTH_PKTBUF 1920 +#define VIDEO_PKTBUF 1920 +#endif + +typedef struct { + libusb_context *ctx; + int should_free_ctx; +} fnusb_ctx; + +typedef struct { + freenect_device *parent; //so we can go up from the libusb userdata + libusb_device_handle *dev; +} fnusb_dev; + +typedef struct { + fnusb_dev *parent; //so we can go up from the libusb userdata + struct libusb_transfer **xfers; + uint8_t *buffer; + fnusb_iso_cb cb; + int num_xfers; + int pkts; + int len; + int dead; + int dead_xfers; +} fnusb_isoc_stream; + +int fnusb_init(fnusb_ctx *ctx, freenect_usb_context *usb_ctx); +int fnusb_shutdown(fnusb_ctx *ctx); +int fnusb_process_events(fnusb_ctx *ctx); + +int fnusb_open_subdevices(freenect_device *dev, int index); +int fnusb_close_subdevices(freenect_device *dev); + +int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_iso_cb cb, int ep, int xfers, int pkts, int len); +int fnusb_stop_iso(fnusb_dev *dev, fnusb_isoc_stream *strm); + +int fnusb_control(fnusb_dev *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength); + + +#endif diff --git a/KinectJNI_v0002/src/libusb/osx/include/libusb-1.0/libusb.h b/KinectJNI_v0002/src/libusb/osx/include/libusb-1.0/libusb.h new file mode 100644 index 0000000..8dc3362 --- /dev/null +++ b/KinectJNI_v0002/src/libusb/osx/include/libusb-1.0/libusb.h @@ -0,0 +1,1322 @@ +/* + * Public libusb header file + * Copyright (C) 2007-2008 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __LIBUSB_H__ +#define __LIBUSB_H__ + +/* MSVC doesn't like inline, but does accept __inline ?? */ +#ifdef _MSC_VER +#define inline __inline +#endif + +#include +#include +#include +#include + +#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) +#include +#endif + +/* 'interface' might be defined as a macro on Windows, so we need to + * undefine it so as not to break the current libusb API, because + * libusb_config_descriptor has an 'interface' member + * As this can be problematic if you include windows.h after libusb.h + * in your sources, we force windows.h to be included first. */ +#if defined(_WIN32) || defined(__CYGWIN__) +#include +#if defined(interface) +#undef interface +#endif +#endif + +/** \def LIBUSB_CALL + * \ingroup misc + * libusb's Windows calling convention. + * + * Under Windows, the selection of available compilers and configurations + * means that, unlike other platforms, there is not one true calling + * convention (calling convention: the manner in which parameters are + * passed to funcions in the generated assembly code). + * + * Matching the Windows API itself, libusb uses the WINAPI convention (which + * translates to the stdcall convention) and guarantees that the + * library is compiled in this way. The public header file also includes + * appropriate annotations so that your own software will use the right + * convention, even if another convention is being used by default within + * your codebase. + * + * The one consideration that you must apply in your software is to mark + * all functions which you use as libusb callbacks with this LIBUSB_CALL + * annotation, so that they too get compiled for the correct calling + * convention. + * + * On non-Windows operating systems, this macro is defined as nothing. This + * means that you can apply it to your code without worrying about + * cross-platform compatibility. + */ +/* LIBUSB_CALL must be defined on both definition and declaration of libusb + * functions. You'd think that declaration would be enough, but cygwin will + * complain about conflicting types unless both are marked this way. + * The placement of this macro is important too; it must appear after the + * return type, before the function name. See internal documentation for + * API_EXPORTED. + */ +#if defined(_WIN32) || defined(__CYGWIN__) +#define LIBUSB_CALL WINAPI +#else +#define LIBUSB_CALL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** \def libusb_cpu_to_le16 + * \ingroup misc + * Convert a 16-bit value from host-endian to little-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the host-endian value to convert + * \returns the value in little-endian byte order + */ +static inline uint16_t libusb_cpu_to_le16(const uint16_t x) +{ + union { + uint8_t b8[2]; + uint16_t b16; + } _tmp; + _tmp.b8[1] = x >> 8; + _tmp.b8[0] = x & 0xff; + return _tmp.b16; +} + +/** \def libusb_le16_to_cpu + * \ingroup misc + * Convert a 16-bit value from little-endian to host-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the little-endian value to convert + * \returns the value in host-endian byte order + */ +#define libusb_le16_to_cpu libusb_cpu_to_le16 + +/* standard USB stuff */ + +/** \ingroup desc + * Device and/or Interface Class codes */ +enum libusb_class_code { + /** In the context of a \ref libusb_device_descriptor "device descriptor", + * this bDeviceClass value indicates that each interface specifies its + * own class information and all interfaces operate independently. + */ + LIBUSB_CLASS_PER_INTERFACE = 0, + + /** Audio class */ + LIBUSB_CLASS_AUDIO = 1, + + /** Communications class */ + LIBUSB_CLASS_COMM = 2, + + /** Human Interface Device class */ + LIBUSB_CLASS_HID = 3, + + /** Printer dclass */ + LIBUSB_CLASS_PRINTER = 7, + + /** Picture transfer protocol class */ + LIBUSB_CLASS_PTP = 6, + + /** Mass storage class */ + LIBUSB_CLASS_MASS_STORAGE = 8, + + /** Hub class */ + LIBUSB_CLASS_HUB = 9, + + /** Data class */ + LIBUSB_CLASS_DATA = 10, + + /** Wireless class */ + LIBUSB_CLASS_WIRELESS = 0xe0, + + /** Application class */ + LIBUSB_CLASS_APPLICATION = 0xfe, + + /** Class is vendor-specific */ + LIBUSB_CLASS_VENDOR_SPEC = 0xff +}; + +/** \ingroup desc + * Descriptor types as defined by the USB specification. */ +enum libusb_descriptor_type { + /** Device descriptor. See libusb_device_descriptor. */ + LIBUSB_DT_DEVICE = 0x01, + + /** Configuration descriptor. See libusb_config_descriptor. */ + LIBUSB_DT_CONFIG = 0x02, + + /** String descriptor */ + LIBUSB_DT_STRING = 0x03, + + /** Interface descriptor. See libusb_interface_descriptor. */ + LIBUSB_DT_INTERFACE = 0x04, + + /** Endpoint descriptor. See libusb_endpoint_descriptor. */ + LIBUSB_DT_ENDPOINT = 0x05, + + /** HID descriptor */ + LIBUSB_DT_HID = 0x21, + + /** HID report descriptor */ + LIBUSB_DT_REPORT = 0x22, + + /** Physical descriptor */ + LIBUSB_DT_PHYSICAL = 0x23, + + /** Hub descriptor */ + LIBUSB_DT_HUB = 0x29 +}; + +/* Descriptor sizes per descriptor type */ +#define LIBUSB_DT_DEVICE_SIZE 18 +#define LIBUSB_DT_CONFIG_SIZE 9 +#define LIBUSB_DT_INTERFACE_SIZE 9 +#define LIBUSB_DT_ENDPOINT_SIZE 7 +#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define LIBUSB_DT_HUB_NONVAR_SIZE 7 + +#define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define LIBUSB_ENDPOINT_DIR_MASK 0x80 + +/** \ingroup desc + * Endpoint direction. Values for bit 7 of the + * \ref libusb_endpoint_descriptor::bEndpointAddress "endpoint address" scheme. + */ +enum libusb_endpoint_direction { + /** In: device-to-host */ + LIBUSB_ENDPOINT_IN = 0x80, + + /** Out: host-to-device */ + LIBUSB_ENDPOINT_OUT = 0x00 +}; + +#define LIBUSB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ + +/** \ingroup desc + * Endpoint transfer type. Values for bits 0:1 of the + * \ref libusb_endpoint_descriptor::bmAttributes "endpoint attributes" field. + */ +enum libusb_transfer_type { + /** Control endpoint */ + LIBUSB_TRANSFER_TYPE_CONTROL = 0, + + /** Isochronous endpoint */ + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, + + /** Bulk endpoint */ + LIBUSB_TRANSFER_TYPE_BULK = 2, + + /** Interrupt endpoint */ + LIBUSB_TRANSFER_TYPE_INTERRUPT = 3 +}; + +/** \ingroup misc + * Standard requests, as defined in table 9-3 of the USB2 specifications */ +enum libusb_standard_request { + /** Request status of the specific recipient */ + LIBUSB_REQUEST_GET_STATUS = 0x00, + + /** Clear or disable a specific feature */ + LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, + + /* 0x02 is reserved */ + + /** Set or enable a specific feature */ + LIBUSB_REQUEST_SET_FEATURE = 0x03, + + /* 0x04 is reserved */ + + /** Set device address for all future accesses */ + LIBUSB_REQUEST_SET_ADDRESS = 0x05, + + /** Get the specified descriptor */ + LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, + + /** Used to update existing descriptors or add new descriptors */ + LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, + + /** Get the current device configuration value */ + LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, + + /** Set device configuration */ + LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, + + /** Return the selected alternate setting for the specified interface */ + LIBUSB_REQUEST_GET_INTERFACE = 0x0A, + + /** Select an alternate interface for the specified interface */ + LIBUSB_REQUEST_SET_INTERFACE = 0x0B, + + /** Set then report an endpoint's synchronization frame */ + LIBUSB_REQUEST_SYNCH_FRAME = 0x0C +}; + +/** \ingroup misc + * Request type bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. */ +enum libusb_request_type { + /** Standard */ + LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), + + /** Class */ + LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), + + /** Vendor */ + LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), + + /** Reserved */ + LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5) +}; + +/** \ingroup misc + * Recipient bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. Values 4 through 31 are reserved. */ +enum libusb_request_recipient { + /** Device */ + LIBUSB_RECIPIENT_DEVICE = 0x00, + + /** Interface */ + LIBUSB_RECIPIENT_INTERFACE = 0x01, + + /** Endpoint */ + LIBUSB_RECIPIENT_ENDPOINT = 0x02, + + /** Other */ + LIBUSB_RECIPIENT_OTHER = 0x03 +}; + +#define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C + +/** \ingroup desc + * Synchronization type for isochronous endpoints. Values for bits 2:3 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_sync_type { + /** No synchronization */ + LIBUSB_ISO_SYNC_TYPE_NONE = 0, + + /** Asynchronous */ + LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, + + /** Adaptive */ + LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, + + /** Synchronous */ + LIBUSB_ISO_SYNC_TYPE_SYNC = 3 +}; + +#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 + +/** \ingroup desc + * Usage type for isochronous endpoints. Values for bits 4:5 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_usage_type { + /** Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_DATA = 0, + + /** Feedback endpoint */ + LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, + + /** Implicit feedback Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2 +}; + +/** \ingroup desc + * A structure representing the standard USB device descriptor. This + * descriptor is documented in section 9.6.1 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_device_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this + * context. */ + uint8_t bDescriptorType; + + /** USB specification release number in binary-coded decimal. A value of + * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */ + uint16_t bcdUSB; + + /** USB-IF class code for the device. See \ref libusb_class_code. */ + uint8_t bDeviceClass; + + /** USB-IF subclass code for the device, qualified by the bDeviceClass + * value */ + uint8_t bDeviceSubClass; + + /** USB-IF protocol code for the device, qualified by the bDeviceClass and + * bDeviceSubClass values */ + uint8_t bDeviceProtocol; + + /** Maximum packet size for endpoint 0 */ + uint8_t bMaxPacketSize0; + + /** USB-IF vendor ID */ + uint16_t idVendor; + + /** USB-IF product ID */ + uint16_t idProduct; + + /** Device release number in binary-coded decimal */ + uint16_t bcdDevice; + + /** Index of string descriptor describing manufacturer */ + uint8_t iManufacturer; + + /** Index of string descriptor describing product */ + uint8_t iProduct; + + /** Index of string descriptor containing device serial number */ + uint8_t iSerialNumber; + + /** Number of possible configurations */ + uint8_t bNumConfigurations; +}; + +/** \ingroup desc + * A structure representing the standard USB endpoint descriptor. This + * descriptor is documented in section 9.6.3 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_endpoint_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in + * this context. */ + uint8_t bDescriptorType; + + /** The address of the endpoint described by this descriptor. Bits 0:3 are + * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction, + * see \ref libusb_endpoint_direction. + */ + uint8_t bEndpointAddress; + + /** Attributes which apply to the endpoint when it is configured using + * the bConfigurationValue. Bits 0:1 determine the transfer type and + * correspond to \ref libusb_transfer_type. Bits 2:3 are only used for + * isochronous endpoints and correspond to \ref libusb_iso_sync_type. + * Bits 4:5 are also only used for isochronous endpoints and correspond to + * \ref libusb_iso_usage_type. Bits 6:7 are reserved. + */ + uint8_t bmAttributes; + + /** Maximum packet size this endpoint is capable of sending/receiving. */ + uint16_t wMaxPacketSize; + + /** Interval for polling endpoint for data transfers. */ + uint8_t bInterval; + + /** For audio devices only: the rate at which synchronization feedback + * is provided. */ + uint8_t bRefresh; + + /** For audio devices only: the address if the synch endpoint */ + uint8_t bSynchAddress; + + /** Extra descriptors. If libusb encounters unknown endpoint descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A structure representing the standard USB interface descriptor. This + * descriptor is documented in section 9.6.5 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_interface_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE + * in this context. */ + uint8_t bDescriptorType; + + /** Number of this interface */ + uint8_t bInterfaceNumber; + + /** Value used to select this alternate setting for this interface */ + uint8_t bAlternateSetting; + + /** Number of endpoints used by this interface (excluding the control + * endpoint). */ + uint8_t bNumEndpoints; + + /** USB-IF class code for this interface. See \ref libusb_class_code. */ + uint8_t bInterfaceClass; + + /** USB-IF subclass code for this interface, qualified by the + * bInterfaceClass value */ + uint8_t bInterfaceSubClass; + + /** USB-IF protocol code for this interface, qualified by the + * bInterfaceClass and bInterfaceSubClass values */ + uint8_t bInterfaceProtocol; + + /** Index of string descriptor describing this interface */ + uint8_t iInterface; + + /** Array of endpoint descriptors. This length of this array is determined + * by the bNumEndpoints field. */ + const struct libusb_endpoint_descriptor *endpoint; + + /** Extra descriptors. If libusb encounters unknown interface descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A collection of alternate settings for a particular USB interface. + */ +struct libusb_interface { + /** Array of interface descriptors. The length of this array is determined + * by the num_altsetting field. */ + const struct libusb_interface_descriptor *altsetting; + + /** The number of alternate settings that belong to this interface */ + int num_altsetting; +}; + +/** \ingroup desc + * A structure representing the standard USB configuration descriptor. This + * descriptor is documented in section 9.6.3 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_config_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG + * in this context. */ + uint8_t bDescriptorType; + + /** Total length of data returned for this configuration */ + uint16_t wTotalLength; + + /** Number of interfaces supported by this configuration */ + uint8_t bNumInterfaces; + + /** Identifier value for this configuration */ + uint8_t bConfigurationValue; + + /** Index of string descriptor describing this configuration */ + uint8_t iConfiguration; + + /** Configuration characteristics */ + uint8_t bmAttributes; + + /** Maximum power consumption of the USB device from this bus in this + * configuration when the device is fully opreation. Expressed in units + * of 2 mA. */ + uint8_t MaxPower; + + /** Array of interfaces supported by this configuration. The length of + * this array is determined by the bNumInterfaces field. */ + const struct libusb_interface *interface; + + /** Extra descriptors. If libusb encounters unknown configuration + * descriptors, it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup asyncio + * Setup packet for control transfers. */ +struct libusb_control_setup { + /** Request type. Bits 0:4 determine recipient, see + * \ref libusb_request_recipient. Bits 5:6 determine type, see + * \ref libusb_request_type. Bit 7 determines data transfer direction, see + * \ref libusb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "LIBUSB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref libusb_standard_request. For other cases, use of this field is + * application-specific. */ + uint8_t bRequest; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ + uint16_t wLength; +}; + +#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup)) + +/* libusb */ + +struct libusb_context; +struct libusb_device; +struct libusb_device_handle; + +/** \ingroup lib + * Structure representing a libusb session. The concept of individual libusb + * sessions allows for your program to use two libraries (or dynamically + * load two modules) which both independently use libusb. This will prevent + * interference between the individual libusb users - for example + * libusb_set_debug() will not affect the other user of the library, and + * libusb_exit() will not destroy resources that the other user is still + * using. + * + * Sessions are created by libusb_init() and destroyed through libusb_exit(). + * If your application is guaranteed to only ever include a single libusb + * user (i.e. you), you do not have to worry about contexts: pass NULL in + * every function call where a context is required. The default context + * will be used. + * + * For more information, see \ref contexts. + */ +typedef struct libusb_context libusb_context; + +/** \ingroup dev + * Structure representing a USB device detected on the system. This is an + * opaque type for which you are only ever provided with a pointer, usually + * originating from libusb_get_device_list(). + * + * Certain operations can be performed on a device, but in order to do any + * I/O you will have to first obtain a device handle using libusb_open(). + * + * Devices are reference counted with libusb_device_ref() and + * libusb_device_unref(), and are freed when the reference count reaches 0. + * New devices presented by libusb_get_device_list() have a reference count of + * 1, and libusb_free_device_list() can optionally decrease the reference count + * on all devices in the list. libusb_open() adds another reference which is + * later destroyed by libusb_close(). + */ +typedef struct libusb_device libusb_device; + + +/** \ingroup dev + * Structure representing a handle on a USB device. This is an opaque type for + * which you are only ever provided with a pointer, usually originating from + * libusb_open(). + * + * A device handle is used to perform I/O and other operations. When finished + * with a device handle, you should call libusb_close(). + */ +typedef struct libusb_device_handle libusb_device_handle; + +/** \ingroup misc + * Error codes. Most libusb functions return 0 on success or one of these + * codes on failure. + * You can use libusb_strerror() to retrieve a short string description of + * a libusb_error enumeration value. + */ +enum libusb_error { + /** Success (no error) */ + LIBUSB_SUCCESS = 0, + + /** Input/output error */ + LIBUSB_ERROR_IO = -1, + + /** Invalid parameter */ + LIBUSB_ERROR_INVALID_PARAM = -2, + + /** Access denied (insufficient permissions) */ + LIBUSB_ERROR_ACCESS = -3, + + /** No such device (it may have been disconnected) */ + LIBUSB_ERROR_NO_DEVICE = -4, + + /** Entity not found */ + LIBUSB_ERROR_NOT_FOUND = -5, + + /** Resource busy */ + LIBUSB_ERROR_BUSY = -6, + + /** Operation timed out */ + LIBUSB_ERROR_TIMEOUT = -7, + + /** Overflow */ + LIBUSB_ERROR_OVERFLOW = -8, + + /** Pipe error */ + LIBUSB_ERROR_PIPE = -9, + + /** System call interrupted (perhaps due to signal) */ + LIBUSB_ERROR_INTERRUPTED = -10, + + /** Insufficient memory */ + LIBUSB_ERROR_NO_MEM = -11, + + /** Operation not supported or unimplemented on this platform */ + LIBUSB_ERROR_NOT_SUPPORTED = -12, + + /** Other error */ + LIBUSB_ERROR_OTHER = -99 + + /* IMPORTANT: when adding new values to this enum, remember to + update the libusb_strerror() function implementation! */ +}; + +/** \ingroup asyncio + * Transfer status codes */ +enum libusb_transfer_status { + /** Transfer completed without error. Note that this does not indicate + * that the entire amount of requested data was transferred. */ + LIBUSB_TRANSFER_COMPLETED, + + /** Transfer failed */ + LIBUSB_TRANSFER_ERROR, + + /** Transfer timed out */ + LIBUSB_TRANSFER_TIMED_OUT, + + /** Transfer was cancelled */ + LIBUSB_TRANSFER_CANCELLED, + + /** For bulk/interrupt endpoints: halt condition detected (endpoint + * stalled). For control endpoints: control request not supported. */ + LIBUSB_TRANSFER_STALL, + + /** Device was disconnected */ + LIBUSB_TRANSFER_NO_DEVICE, + + /** Device sent more data than requested */ + LIBUSB_TRANSFER_OVERFLOW +}; + +/** \ingroup asyncio + * libusb_transfer.flags values */ +enum libusb_transfer_flags { + /** Report short frames as errors */ + LIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0, + + /** Automatically free() transfer buffer during libusb_free_transfer() */ + LIBUSB_TRANSFER_FREE_BUFFER = 1<<1, + + /** Automatically call libusb_free_transfer() after callback returns. + * If this flag is set, it is illegal to call libusb_free_transfer() + * from your transfer callback, as this will result in a double-free + * when this flag is acted upon. */ + LIBUSB_TRANSFER_FREE_TRANSFER = 1<<2 +}; + +/** \ingroup asyncio + * Isochronous packet descriptor. */ +struct libusb_iso_packet_descriptor { + /** Length of data to request in this packet */ + unsigned int length; + + /** Amount of data that was actually transferred */ + unsigned int actual_length; + + /** Status code for this packet */ + enum libusb_transfer_status status; +}; + +struct libusb_transfer; + +/** \ingroup asyncio + * Asynchronous transfer callback function type. When submitting asynchronous + * transfers, you pass a pointer to a callback function of this type via the + * \ref libusb_transfer::callback "callback" member of the libusb_transfer + * structure. libusb will call this function later, when the transfer has + * completed or failed. See \ref asyncio for more information. + * \param transfer The libusb_transfer struct the callback function is being + * notified about. + */ +typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer); + +/** \ingroup asyncio + * The generic USB transfer structure. The user populates this structure and + * then submits it in order to request a transfer. After the transfer has + * completed, the library populates the transfer with the results and passes + * it back to the user. + */ +struct libusb_transfer { + /** Handle of the device that this transfer will be submitted to */ + libusb_device_handle *dev_handle; + + /** A bitwise OR combination of \ref libusb_transfer_flags. */ + uint8_t flags; + + /** Address of the endpoint where this transfer will be sent. */ + unsigned char endpoint; + + /** Type of the endpoint from \ref libusb_transfer_type */ + unsigned char type; + + /** Timeout for this transfer in millseconds. A value of 0 indicates no + * timeout. */ + unsigned int timeout; + + /** The status of the transfer. Read-only, and only for use within + * transfer callback function. + * + * If this is an isochronous transfer, this field may read COMPLETED even + * if there were errors in the frames. Use the + * \ref libusb_iso_packet_descriptor::status "status" field in each packet + * to determine if errors occurred. */ + enum libusb_transfer_status status; + + /** Length of the data buffer */ + int length; + + /** Actual length of data that was transferred. Read-only, and only for + * use within transfer callback function. Not valid for isochronous + * endpoint transfers. */ + int actual_length; + + /** Callback function. This will be invoked when the transfer completes, + * fails, or is cancelled. */ + libusb_transfer_cb_fn callback; + + /** User context data to pass to the callback function. */ + void *user_data; + + /** Data buffer */ + unsigned char *buffer; + + /** Number of isochronous packets. Only used for I/O with isochronous + * endpoints. */ + int num_iso_packets; + + /** Isochronous packet descriptors, for isochronous transfers only. */ + struct libusb_iso_packet_descriptor iso_packet_desc +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +int LIBUSB_CALL libusb_init(libusb_context **ctx); +void LIBUSB_CALL libusb_exit(libusb_context *ctx); +void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); +const char * LIBUSB_CALL libusb_strerror(enum libusb_error errcode); + +ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx, + libusb_device ***list); +void LIBUSB_CALL libusb_free_device_list(libusb_device **list, + int unref_devices); +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev); +void LIBUSB_CALL libusb_unref_device(libusb_device *dev); + +int LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev, + int *config); +int LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc); +int LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config); +void LIBUSB_CALL libusb_free_config_descriptor( + struct libusb_config_descriptor *config); +uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev); +int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint); + +int LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **handle); +void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle); +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev, + int configuration); +int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev, + int interface_number); + +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id); + +int LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev, + int interface_number, int alternate_setting); +int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev); + +int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev, + int interface_number); + +/* async I/O */ + +/** \ingroup asyncio + * Get the data section of a control transfer. This convenience function is here + * to remind you that the data does not start until 8 bytes into the actual + * buffer, as the setup packet comes first. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns pointer to the first byte of the data section + */ +static inline unsigned char *libusb_control_transfer_get_data( + struct libusb_transfer *transfer) +{ + return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; +} + +/** \ingroup asyncio + * Get the control setup packet of a control transfer. This convenience + * function is here to remind you that the control setup occupies the first + * 8 bytes of the transfer data buffer. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns a casted pointer to the start of the transfer data buffer + */ +static inline struct libusb_control_setup *libusb_control_transfer_get_setup( + struct libusb_transfer *transfer) +{ + return (struct libusb_control_setup *) transfer->buffer; +} + +/** \ingroup asyncio + * Helper function to populate the setup packet (first 8 bytes of the data + * buffer) for a control transfer. The wIndex, wValue and wLength values should + * be given in host-endian byte order. + * + * \param buffer buffer to output the setup packet into + * \param bmRequestType see the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field of + * \ref libusb_control_setup + * \param bRequest see the + * \ref libusb_control_setup::bRequest "bRequest" field of + * \ref libusb_control_setup + * \param wValue see the + * \ref libusb_control_setup::wValue "wValue" field of + * \ref libusb_control_setup + * \param wIndex see the + * \ref libusb_control_setup::wIndex "wIndex" field of + * \ref libusb_control_setup + * \param wLength see the + * \ref libusb_control_setup::wLength "wLength" field of + * \ref libusb_control_setup + */ +static inline void libusb_fill_control_setup(unsigned char *buffer, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + uint16_t wLength) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer; + setup->bmRequestType = bmRequestType; + setup->bRequest = bRequest; + setup->wValue = libusb_cpu_to_le16(wValue); + setup->wIndex = libusb_cpu_to_le16(wIndex); + setup->wLength = libusb_cpu_to_le16(wLength); +} + +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets); +int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer); +int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer); + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a control transfer. + * + * If you pass a transfer buffer to this function, the first 8 bytes will + * be interpreted as a control setup packet, and the wLength field will be + * used to automatically populate the \ref libusb_transfer::length "length" + * field of the transfer. Therefore the recommended approach is: + * -# Allocate a suitably sized data buffer (including space for control setup) + * -# Call libusb_fill_control_setup() + * -# If this is a host-to-device transfer with a data stage, put the data + * in place after the setup packet + * -# Call this function + * -# Call libusb_submit_transfer() + * + * It is also legal to pass a NULL buffer to this function, in which case this + * function will not attempt to populate the length field. Remember that you + * must then populate the buffer and length fields later. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param buffer data buffer. If provided, this function will interpret the + * first 8 bytes as a setup packet and infer the transfer length from that. + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_control_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, + unsigned int timeout) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer; + transfer->dev_handle = dev_handle; + transfer->endpoint = 0; + transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL; + transfer->timeout = timeout; + transfer->buffer = buffer; + if (setup) + transfer->length = LIBUSB_CONTROL_SETUP_SIZE + + libusb_le16_to_cpu(setup->wLength); + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_BULK; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an interrupt transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_interrupt_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an isochronous transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param num_iso_packets the number of isochronous packets + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, int num_iso_packets, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->num_iso_packets = num_iso_packets; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Convenience function to set the length of all packets in an isochronous + * transfer, based on the num_iso_packets field in the transfer structure. + * + * \param transfer a transfer + * \param length the length to set in each isochronous packet descriptor + * \see libusb_get_max_packet_size() + */ +static inline void libusb_set_iso_packet_lengths( + struct libusb_transfer *transfer, unsigned int length) +{ + int i; + for (i = 0; i < transfer->num_iso_packets; i++) + transfer->iso_packet_desc[i].length = length; +} + +/** \ingroup asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer. + * + * This is a thorough function which loops through all preceding packets, + * accumulating their lengths to find the position of the specified packet. + * Typically you will assign equal lengths to each packet in the transfer, + * and hence the above method is sub-optimal. You may wish to use + * libusb_get_iso_packet_buffer_simple() instead. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer_simple() + */ +static inline unsigned char *libusb_get_iso_packet_buffer( + struct libusb_transfer *transfer, unsigned int packet) +{ + int i; + size_t offset = 0; + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + for (i = 0; i < _packet; i++) + offset += transfer->iso_packet_desc[i].length; + + return transfer->buffer + offset; +} + +/** \ingroup asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer, for transfers where each + * packet is of identical size. + * + * This function relies on the assumption that every packet within the transfer + * is of identical size to the first packet. Calculating the location of + * the packet buffer is then just a simple calculation: + * buffer + (packet_size * packet) + * + * Do not use this function on transfers other than those that have identical + * packet lengths for each packet. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer() + */ +static inline unsigned char *libusb_get_iso_packet_buffer_simple( + struct libusb_transfer *transfer, unsigned int packet) +{ + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + return transfer->buffer + (transfer->iso_packet_desc[0].length * _packet); +} + +/* sync I/O */ + +int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout); + +int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +int LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +/** \ingroup desc + * Retrieve a descriptor from the default control pipe. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. + * + * \param dev a device handle + * \param desc_type the descriptor type, see \ref libusb_descriptor_type + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +static inline int libusb_get_descriptor(libusb_device_handle *dev, + uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) +{ + return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data, + (uint16_t) length, 1000); +} + +/** \ingroup desc + * Retrieve a descriptor from a device. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. The string returned is Unicode, as + * detailed in the USB specifications. + * + * \param dev a device handle + * \param desc_index the index of the descriptor to retrieve + * \param langid the language ID for the string descriptor + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + * \see libusb_get_string_descriptor_ascii() + */ +static inline int libusb_get_string_descriptor(libusb_device_handle *dev, + uint8_t desc_index, uint16_t langid, unsigned char *data, int length) +{ + return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING << 8) | desc_index, + langid, data, (uint16_t) length, 1000); +} + +int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + uint8_t desc_index, unsigned char *data, int length); + +/* polling and timeouts */ + +int LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_events(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx); +int LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); + +int LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_handle_events(libusb_context *ctx); +int LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx); +int LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv); + +/** \ingroup poll + * File descriptor for polling + */ +struct libusb_pollfd { + /** Numeric file descriptor */ + int fd; + + /** Event flags to poll for from . POLLIN indicates that you + * should monitor this file descriptor for becoming ready to read from, + * and POLLOUT indicates that you should monitor this file descriptor for + * nonblocking write readiness. */ + short events; +}; + +/** \ingroup poll + * Callback function, invoked when a new file descriptor should be added + * to the set of file descriptors monitored for events. + * \param fd the new file descriptor + * \param events events to monitor for, see \ref libusb_pollfd for a + * description + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events, + void *user_data); + +/** \ingroup poll + * Callback function, invoked when a file descriptor should be removed from + * the set of file descriptors being monitored for events. After returning + * from this callback, do not use that file descriptor again. + * \param fd the file descriptor to stop monitoring + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data); + +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx); +void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/KinectJNI_v0002/src/libusb/osx/libs/libusb-1.0.a b/KinectJNI_v0002/src/libusb/osx/libs/libusb-1.0.a new file mode 100644 index 0000000000000000000000000000000000000000..c486e36a086d271308454e8b860bf2f059a60f76 GIT binary patch literal 118752 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%0As*6fRy_)ka8~rdq8gk;>ynH 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 RqB~lq`)BJhxsJs1{{Wu2l{)|c literal 0 HcmV?d00001 diff --git a/KinectJNI_v0002/src/libusb/osx/libs/usb-1.0.a b/KinectJNI_v0002/src/libusb/osx/libs/usb-1.0.a new file mode 100644 index 0000000000000000000000000000000000000000..3a2222ddfde83241933d4bedcc86581bfb9949d7 GIT binary patch literal 163136 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 diff --git a/KinectJNI_v0002/src/native/NativeAddressBook.m b/KinectJNI_v0002/src/native/NativeAddressBook.m new file mode 100644 index 0000000..c017953 --- /dev/null +++ b/KinectJNI_v0002/src/native/NativeAddressBook.m @@ -0,0 +1,16 @@ +// +// NativeAddressBook.m +// KinectJNI +// +// Created by Daniel Shiffman on 11/14/10. +// Copyright 2010 ITP. All rights reserved. +// + + +#import "shiffman_kinect_NativeAddressBook.h" // generated from NativeAddressBook.java + +JNIEXPORT jint JNICALL Java_shiffman_kinect_NativeAddressBook_getNumber +(JNIEnv *env, jclass clazz) +{ + return 55; +} \ No newline at end of file diff --git a/KinectJNI_v0002/src/native/NativeKinect.cpp b/KinectJNI_v0002/src/native/NativeKinect.cpp new file mode 100644 index 0000000..fa8029b --- /dev/null +++ b/KinectJNI_v0002/src/native/NativeKinect.cpp @@ -0,0 +1,19 @@ +/* + * NativeKinect.cpp + * KinectJNI + * + * Created by Daniel Shiffman on 11/14/10. + * Copyright 2010 ITP. All rights reserved. + * + */ + +#include "NativeKinect.h" + +#import "shiffman_kinect_NativeKinect.h" // generated from NativeAddressBook.java + +JNIEXPORT jint JNICALL Java_shiffman_kinect_NativeKinect_getNumber +(JNIEnv *env, jclass clazz) +{ + return 66; +} + diff --git a/KinectJNI_v0002/src/native/NativeKinect.h b/KinectJNI_v0002/src/native/NativeKinect.h new file mode 100644 index 0000000..eb1b3ea --- /dev/null +++ b/KinectJNI_v0002/src/native/NativeKinect.h @@ -0,0 +1,10 @@ +/* + * NativeKinect.h + * KinectJNI + * + * Created by Daniel Shiffman on 11/14/10. + * Copyright 2010 ITP. All rights reserved. + * + */ + +#include \ No newline at end of file diff --git a/KinectJNI_v0002/src/native/native-1.moved-aside/NativeKinect.h b/KinectJNI_v0002/src/native/native-1.moved-aside/NativeKinect.h new file mode 100644 index 0000000..0c1857b --- /dev/null +++ b/KinectJNI_v0002/src/native/native-1.moved-aside/NativeKinect.h @@ -0,0 +1,9 @@ +/* + * NativeKinect.h + * KinectJNI + * + * Created by Daniel Shiffman on 11/14/10. + * Copyright 2010 ITP. All rights reserved. + * + */ + diff --git a/KinectJNI_v0002/src/native/org_openkinect_Context.cpp b/KinectJNI_v0002/src/native/org_openkinect_Context.cpp new file mode 100644 index 0000000..0f8b71f --- /dev/null +++ b/KinectJNI_v0002/src/native/org_openkinect_Context.cpp @@ -0,0 +1,199 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#include +#include +#include +#include + +#include "org_openkinect_Context.h" + + +struct Data +{ + void *rgb; + void *depth; + + Data() : rgb(0), depth(0) {} +}; + +std::list logs; +std::map data; + +jobject jDevice(JNIEnv* env, jobject jContext, freenect_device *dev) +{ + jclass clazz = env->GetObjectClass(jContext); + jmethodID methodID = env->GetMethodID(clazz, "device", "(J)Lorg/openkinect/Device;"); + return env->CallObjectMethod(jContext, methodID, (jlong) dev); +} + +void log_cb(freenect_context *context, freenect_loglevel level, const char *msg) +{ + logs.push_back(msg); +} + +void rgb_cb(freenect_device *dev, void *rgb, uint32_t timestamp) +{ + data[dev].rgb = rgb; +} + +void depth_cb(freenect_device *dev, void *v_depth, uint32_t timestamp) +{ + data[dev].depth = v_depth; +} + +freenect_context *context(JNIEnv *env, jobject obj) +{ + jclass clazz = env->GetObjectClass(obj); + jfieldID fieldID = env->GetFieldID(clazz, "jni", "J"); + + jlong ptr = env->GetLongField(obj, fieldID); + return (freenect_context*) ptr; +} + + +JNIEXPORT jlong JNICALL Java_org_openkinect_Context_jniInit + (JNIEnv *, jobject) +{ + freenect_context *f_ctx = 0; + + if (freenect_init(&f_ctx, NULL) < 0) + { + return 0; + } + + freenect_set_log_callback(f_ctx, log_cb); + + return (jlong) f_ctx; +} + +JNIEXPORT void JNICALL Java_org_openkinect_Context_jniShutdown + (JNIEnv *env, jobject obj) +{ + freenect_context *f_ctx = context(env, obj); + freenect_shutdown(f_ctx); +} + +JNIEXPORT jboolean JNICALL Java_org_openkinect_Context_jniProcessEvents + (JNIEnv *env, jobject jContext) +{ + + freenect_context *f_ctx = context(env, jContext); + + for(std::list::const_iterator it = logs.begin(); it != logs.end(); ++it) + { + jobject jString = env->NewStringUTF(it->c_str()); + jclass clazz = env->GetObjectClass(jContext); + jmethodID methodID = env->GetMethodID(clazz, "onLog", "(Ljava/lang/String;)V"); + env->CallVoidMethod(jContext, methodID, jString); + } + logs.clear(); + + bool success = (freenect_process_events(f_ctx) >= 0); + + + + for(std::map::iterator it = data.begin(); it != data.end(); ++it) + { + freenect_device *f_dev = it->first; + Data& d = it->second; + + if(d.rgb) + { + jobject buffer = env->NewDirectByteBuffer(d.rgb, FREENECT_VIDEO_RGB_SIZE); + + jobject device = jDevice(env, jContext, f_dev); + jclass clazz = env->GetObjectClass(device); + jmethodID methodID = env->GetMethodID(clazz, "onRGB", "(Ljava/nio/ByteBuffer;)V"); + env->CallVoidMethod(device, methodID, buffer); + + d.rgb = 0; + } + + if(d.depth) + { + jobject buffer = env->NewDirectByteBuffer(d.depth, FREENECT_DEPTH_11BIT_SIZE); + + jobject device = jDevice(env, jContext, f_dev); + jclass clazz = env->GetObjectClass(device); + jmethodID methodID = env->GetMethodID(clazz, "onDepth", "(Ljava/nio/ByteBuffer;)V"); + env->CallVoidMethod(device, methodID, buffer); + + d.depth = 0; + } + + { + // WHOA NEED TO FIX! + /*freenect_update_device_state(f_dev); + freenect_raw_device_state* f_dev_raw = freenect_get_device_state(f_dev); + + double x, y, z; + freenect_get_mks_accel(f_dev_raw, &x, &y, &z); + + jobject device = jDevice(env, jContext, f_dev); + jclass clazz = env->GetObjectClass(device); + jmethodID methodID = env->GetMethodID(clazz, "onAcceleration", "(FFF)V"); + env->CallVoidMethod(device, methodID, (jfloat) x, (jfloat) y, (jfloat) z);*/ + } + } + + return success; +} + +JNIEXPORT jint JNICALL Java_org_openkinect_Context_jniNumDevices + (JNIEnv *env, jobject obj) +{ + freenect_context *f_ctx = context(env, obj); + return freenect_num_devices(f_ctx); +} + +JNIEXPORT jlong JNICALL Java_org_openkinect_Context_jniOpenDevice + (JNIEnv *env, jobject obj, jint index) +{ + freenect_context *f_ctx = context(env, obj); + + freenect_device *f_dev = 0; + if(freenect_open_device(f_ctx, &f_dev, index) < 0) + { + return 0; + } + + freenect_set_video_callback(f_dev, rgb_cb); + freenect_set_depth_callback(f_dev, depth_cb); + + return (jlong) f_dev; +} + +JNIEXPORT void JNICALL Java_org_openkinect_Context_jniSetLogLevel + (JNIEnv *env, jobject obj, jint level) +{ + freenect_context *f_ctx = context(env, obj); + freenect_set_log_level(f_ctx, (freenect_loglevel) level); +} + + + + diff --git a/KinectJNI_v0002/src/native/org_openkinect_Context.h b/KinectJNI_v0002/src/native/org_openkinect_Context.h new file mode 100644 index 0000000..25b2e32 --- /dev/null +++ b/KinectJNI_v0002/src/native/org_openkinect_Context.h @@ -0,0 +1,61 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_openkinect_Context */ + +#ifndef _Included_org_openkinect_Context +#define _Included_org_openkinect_Context +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_openkinect_Context + * Method: jniInit + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_openkinect_Context_jniInit + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Context + * Method: jniShutdown + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Context_jniShutdown + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Context + * Method: jniProcessEvents + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_openkinect_Context_jniProcessEvents + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Context + * Method: jniNumDevices + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_openkinect_Context_jniNumDevices + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Context + * Method: jniOpenDevice + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_org_openkinect_Context_jniOpenDevice + (JNIEnv *, jobject, jint); + +/* + * Class: org_openkinect_Context + * Method: jniSetLogLevel + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Context_jniSetLogLevel + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/KinectJNI_v0002/src/native/org_openkinect_Device.cpp b/KinectJNI_v0002/src/native/org_openkinect_Device.cpp new file mode 100644 index 0000000..921ca91 --- /dev/null +++ b/KinectJNI_v0002/src/native/org_openkinect_Device.cpp @@ -0,0 +1,102 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +#include + +#include "org_openkinect_Device.h" + +freenect_device *device(JNIEnv *env, jobject obj) +{ + jclass clazz = env->GetObjectClass(obj); + jfieldID fieldID = env->GetFieldID(clazz, "jni", "J"); + + jlong ptr = env->GetLongField(obj, fieldID); + return (freenect_device*) ptr; +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniClose + (JNIEnv *env, jobject obj) +{ + freenect_device *f_dev = device(env, obj); + freenect_close_device(f_dev); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetLED + (JNIEnv *env, jobject obj, jint led) +{ + freenect_device *f_dev = device(env, obj); + freenect_set_led(f_dev, (freenect_led_options) led); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetTiltDegs + (JNIEnv *env, jobject obj, jfloat deg) +{ + freenect_device *f_dev = device(env, obj); + freenect_set_tilt_degs(f_dev, (double) deg); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetFormatRGB + (JNIEnv *env, jobject obj, jint format) +{ + freenect_device *f_dev = device(env, obj); + freenect_set_video_format(f_dev, (freenect_video_format) format); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetFormatDepth + (JNIEnv *env, jobject obj, jint format) +{ + freenect_device *f_dev = device(env, obj); + freenect_set_depth_format(f_dev, (freenect_depth_format) format); +} + + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStartCaptureRGB + (JNIEnv *env, jobject obj) +{ + freenect_device *f_dev = device(env, obj); + freenect_start_video(f_dev); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStartCaptureDepth + (JNIEnv *env, jobject obj) +{ + freenect_device *f_dev = device(env, obj); + freenect_start_depth(f_dev); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStopCaptureRGB +(JNIEnv *env, jobject obj) +{ + freenect_device *f_dev = device(env, obj); + freenect_stop_video(f_dev); +} + +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStopCaptureDepth + (JNIEnv *env, jobject obj) +{ + freenect_device *f_dev = device(env, obj); + freenect_stop_depth(f_dev); +} diff --git a/KinectJNI_v0002/src/native/org_openkinect_Device.h b/KinectJNI_v0002/src/native/org_openkinect_Device.h new file mode 100644 index 0000000..9e8d737 --- /dev/null +++ b/KinectJNI_v0002/src/native/org_openkinect_Device.h @@ -0,0 +1,85 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_openkinect_Device */ + +#ifndef _Included_org_openkinect_Device +#define _Included_org_openkinect_Device +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_openkinect_Device + * Method: jniClose + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniClose + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Device + * Method: jniSetLED + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetLED + (JNIEnv *, jobject, jint); + +/* + * Class: org_openkinect_Device + * Method: jniSetTiltDegs + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetTiltDegs + (JNIEnv *, jobject, jfloat); + +/* + * Class: org_openkinect_Device + * Method: jniSetFormatRGB + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetFormatRGB + (JNIEnv *, jobject, jint); + +/* + * Class: org_openkinect_Device + * Method: jniSetFormatDepth + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniSetFormatDepth + (JNIEnv *, jobject, jint); + +/* + * Class: org_openkinect_Device + * Method: jniStartCaptureRGB + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStartCaptureRGB + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Device + * Method: jniStartCaptureDepth + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStartCaptureDepth + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Device + * Method: jniStopCaptureRGB + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStopCaptureRGB + (JNIEnv *, jobject); + +/* + * Class: org_openkinect_Device + * Method: jniStopCaptureDepth + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_openkinect_Device_jniStopCaptureDepth + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/KinectJNI_v0002/src/org/openkinect/Acceleration.java b/KinectJNI_v0002/src/org/openkinect/Acceleration.java new file mode 100644 index 0000000..6cdd14c --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/Acceleration.java @@ -0,0 +1,35 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public interface Acceleration +{ + void direction(float x, float y, float z); +} diff --git a/KinectJNI_v0002/src/org/openkinect/ColorFormat.java b/KinectJNI_v0002/src/org/openkinect/ColorFormat.java new file mode 100644 index 0000000..109ffad --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/ColorFormat.java @@ -0,0 +1,36 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum ColorFormat +{ + RGB_8_8_8, + BAYER, +} diff --git a/KinectJNI_v0002/src/org/openkinect/Context.java b/KinectJNI_v0002/src/org/openkinect/Context.java new file mode 100644 index 0000000..105a725 --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/Context.java @@ -0,0 +1,148 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Michael Nischt + */ +public class Context +{ + // + + static + { + System.loadLibrary("OpenKinect"); + } + + public static Context getContext() + { + return instance; + } + private static final Context instance = new Context(); + + // + + private final long jni; + private Logger logger; + private final Map jniMap = new HashMap(); + + private Context() + { + jni = jniInit(); + + Runtime.getRuntime().addShutdownHook(new Thread() + { + @Override + public void run() + { + List devices = new ArrayList(jniMap.values()); + for(Device device : devices) + { + device.dispose(); + } + jniShutdown(); + } + }); + } + + public int devices() + { + return jniNumDevices(); + } + + public Device getDevice(int index) + { + long dev_ptr = jniOpenDevice(index); + if(dev_ptr == 0) + { + return null; + } + Device device = new Device(this, dev_ptr); + jniMap.put(dev_ptr, device); + return device; + } + + public boolean processEvents() + { + return jniProcessEvents(); + } + + public Device device(long jni) + { + return jniMap.get(jni); + } + + public void log(Logger logger) + { + log(logger, LogLevel.INFO); + } + + public void log(Logger logger, LogLevel level) + { + jniSetLogLevel(level.ordinal()); + this.logger = logger; + } + + void disposeDevice(long dev_ptr) + { + jniMap.remove(dev_ptr); + } + + + // + + void onLog(String msg) + { + if(logger != null) + { + logger.log(msg); + } + } + + // + + // + + native private long jniInit(); + + native private void jniShutdown(); + + native private boolean jniProcessEvents(); + + native private int jniNumDevices(); + + native private long jniOpenDevice(int index); + + native private void jniSetLogLevel(int level); + + // +} diff --git a/KinectJNI_v0002/src/org/openkinect/DepthFormat.java b/KinectJNI_v0002/src/org/openkinect/DepthFormat.java new file mode 100644 index 0000000..ed7f429 --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/DepthFormat.java @@ -0,0 +1,38 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum DepthFormat +{ + RAW_11, + RAW_10, + PACKED_11, + PACKED_10; +} diff --git a/KinectJNI_v0002/src/org/openkinect/Device.java b/KinectJNI_v0002/src/org/openkinect/Device.java new file mode 100644 index 0000000..a68a700 --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/Device.java @@ -0,0 +1,185 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @author Michael Nischt + */ +public final class Device +{ + private final Context context; + private long jni; + + private Image rgb, depth; + private Acceleration acceleration; + + Device(Context context, long jni) + { + if(context == null) + { + throw new NullPointerException(); + } + + this.context = context; + this.jni = jni; + } + + public void light(LEDStatus led) + { + checkDisposed(); + + jniSetLED(led.ordinal()); + } + + public void tilt(float deg) + { + checkDisposed(); + + jniSetTiltDegs(deg); + } + + public void color(Image image) + { + color(image, ColorFormat.RGB_8_8_8); + } + + public void color(Image image, ColorFormat format) + { + checkDisposed(); + + jniSetFormatRGB(format.ordinal()); + rgb = image; + + if(rgb != null) + { + jniStartCaptureRGB(); + } + else + { + jniStopCaptureRGB(); + } + } + + public void depth(Image image) + { + depth(image, DepthFormat.RAW_11); + } + + public void depth(Image image, DepthFormat format) + { + checkDisposed(); + + jniSetFormatDepth(format.ordinal()); + depth = image; + + if(depth != null) + { + jniStartCaptureDepth(); + } + else + { + jniStopCaptureDepth(); + } + } + + public void acceleration(Acceleration acceleration) + { + checkDisposed(); + + this.acceleration = acceleration; + } + + public void dispose() + { + context.disposeDevice(jni); + jniClose(); + jni = 0; + } + + private void checkDisposed() + { + if(jni == 0) + { + throw new IllegalStateException("Device already dispoed."); + } + } + + // + + void onRGB(ByteBuffer buffer) + { + if (rgb != null) + { + buffer.order(ByteOrder.nativeOrder()); + rgb.data(buffer); + } + } + + void onDepth(ByteBuffer buffer) + { + if (depth != null) + { + buffer.order(ByteOrder.nativeOrder()); + depth.data(buffer); + } + } + + void onAcceleration(float x, float y, float z) + { + if (acceleration != null) + { + acceleration.direction(x, y, z); + } + } + + // + + // + + native private void jniClose(); + + native private void jniSetLED(int light); + + native private void jniSetTiltDegs(float deg); + + native private void jniSetFormatRGB(int format); + + native private void jniSetFormatDepth(int format); + + native private void jniStartCaptureRGB(); + + native private void jniStartCaptureDepth(); + + native private void jniStopCaptureRGB(); + + native private void jniStopCaptureDepth(); + + // +} diff --git a/KinectJNI_v0002/src/org/openkinect/Image.java b/KinectJNI_v0002/src/org/openkinect/Image.java new file mode 100644 index 0000000..7acb78b --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/Image.java @@ -0,0 +1,37 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +import java.nio.ByteBuffer; + +/** + * @author Michael Nischt + */ +public interface Image +{ + void data(ByteBuffer image); +} diff --git a/KinectJNI_v0002/src/org/openkinect/LEDStatus.java b/KinectJNI_v0002/src/org/openkinect/LEDStatus.java new file mode 100644 index 0000000..80106e9 --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/LEDStatus.java @@ -0,0 +1,41 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum LEDStatus +{ + LED_OFF, + LED_GREEN, + LED_RED, + LED_YELLOW, + LED_BLINK_YELLOW, + LED_BLINK_GREEN, + LED_BLINK_RED_YELLOW; +} diff --git a/KinectJNI_v0002/src/org/openkinect/LogLevel.java b/KinectJNI_v0002/src/org/openkinect/LogLevel.java new file mode 100644 index 0000000..4904b7e --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/LogLevel.java @@ -0,0 +1,42 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum LogLevel +{ + FATAL, + ERROR, + WARNING, + NOTICE, + INFO, + DEBUG, + SPEW, + FLOOD; +} diff --git a/KinectJNI_v0002/src/org/openkinect/Logger.java b/KinectJNI_v0002/src/org/openkinect/Logger.java new file mode 100644 index 0000000..cb445da --- /dev/null +++ b/KinectJNI_v0002/src/org/openkinect/Logger.java @@ -0,0 +1,35 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public interface Logger +{ + void log(String msg); +} diff --git a/OpenKinect-Processing/.classpath b/OpenKinect-Processing/.classpath new file mode 100755 index 0000000..4c10b9d --- /dev/null +++ b/OpenKinect-Processing/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/OpenKinect-Processing/.gitignore b/OpenKinect-Processing/.gitignore new file mode 100755 index 0000000..c8572d9 --- /dev/null +++ b/OpenKinect-Processing/.gitignore @@ -0,0 +1 @@ +distribution diff --git a/OpenKinect-Processing/.project b/OpenKinect-Processing/.project new file mode 100755 index 0000000..8c757d1 --- /dev/null +++ b/OpenKinect-Processing/.project @@ -0,0 +1,17 @@ + + + OpenKinect-Processing + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/OpenKinect-Processing/data/kinectThreshold.txt b/OpenKinect-Processing/data/kinectThreshold.txt new file mode 100644 index 0000000..1217bfd --- /dev/null +++ b/OpenKinect-Processing/data/kinectThreshold.txt @@ -0,0 +1 @@ +630 diff --git a/OpenKinect-Processing/examples/AveragePointTracking/AveragePointTracking.pde b/OpenKinect-Processing/examples/AveragePointTracking/AveragePointTracking.pde new file mode 100644 index 0000000..d7eb226 --- /dev/null +++ b/OpenKinect-Processing/examples/AveragePointTracking/AveragePointTracking.pde @@ -0,0 +1,65 @@ +// Daniel Shiffman +// Tracking the average location beyond a given depth threshold +// Thanks to Dan O'Sullivan +// http://www.shiffman.net +// https://github.com/shiffman/libfreenect/tree/master/wrappers/java/processing + +import org.openkinect.*; +import org.openkinect.processing.*; + +// Showing how we can farm all the kinect stuff out to a separate class +KinectTracker tracker; +// Kinect Library object +Kinect kinect; + +void setup() { + size(640,520); + kinect = new Kinect(this); + tracker = new KinectTracker(); +} + +void draw() { + background(255); + + // Run the tracking analysis + tracker.track(); + // Show the image + tracker.display(); + + // Let's draw the raw location + PVector v1 = tracker.getPos(); + fill(50,100,250,200); + noStroke(); + ellipse(v1.x,v1.y,20,20); + + // Let's draw the "lerped" location + PVector v2 = tracker.getLerpedPos(); + fill(100,250,50,200); + noStroke(); + ellipse(v2.x,v2.y,20,20); + + // Display some info + int t = tracker.getThreshold(); + fill(0); + text("threshold: " + t + " " + "framerate: " + (int)frameRate + " " + "UP increase threshold, DOWN decrease threshold",10,500); +} + +void keyPressed() { + int t = tracker.getThreshold(); + if (key == CODED) { + if (keyCode == UP) { + t+=5; + tracker.setThreshold(t); + } + else if (keyCode == DOWN) { + t-=5; + tracker.setThreshold(t); + } + } +} + +void stop() { + tracker.quit(); + super.stop(); +} + diff --git a/OpenKinect-Processing/examples/AveragePointTracking/KinectTracker.pde b/OpenKinect-Processing/examples/AveragePointTracking/KinectTracker.pde new file mode 100644 index 0000000..c15c854 --- /dev/null +++ b/OpenKinect-Processing/examples/AveragePointTracking/KinectTracker.pde @@ -0,0 +1,125 @@ +class KinectTracker { + + + + // Size of kinect image + int kw = 640; + int kh = 480; + int threshold = 745; + + // Raw location + PVector loc; + + // Interpolated location + PVector lerpedLoc; + + // Depth data + int[] depth; + + + PImage display; + + KinectTracker() { + kinect.start(); + kinect.enableDepth(true); + + // We could skip processing the grayscale image for efficiency + // but this example is just demonstrating everything + kinect.processDepthImage(true); + + display = createImage(kw,kh,PConstants.RGB); + + loc = new PVector(0,0); + lerpedLoc = new PVector(0,0); + } + + void track() { + + // Get the raw depth as array of integers + depth = kinect.getRawDepth(); + + // Being overly cautious here + if (depth == null) return; + + float sumX = 0; + float sumY = 0; + float count = 0; + + for(int x = 0; x < kw; x++) { + for(int y = 0; y < kh; y++) { + // Mirroring the image + int offset = kw-x-1+y*kw; + // Grabbing the raw depth + int rawDepth = depth[offset]; + + // Testing against threshold + if (rawDepth < threshold) { + sumX += x; + sumY += y; + count++; + } + } + } + // As long as we found something + if (count != 0) { + loc = new PVector(sumX/count,sumY/count); + } + + // Interpolating the location, doing it arbitrarily for now + lerpedLoc.x = PApplet.lerp(lerpedLoc.x, loc.x, 0.3f); + lerpedLoc.y = PApplet.lerp(lerpedLoc.y, loc.y, 0.3f); + } + + PVector getLerpedPos() { + return lerpedLoc; + } + + PVector getPos() { + return loc; + } + + void display() { + PImage img = kinect.getDepthImage(); + + // Being overly cautious here + if (depth == null || img == null) return; + + // Going to rewrite the depth image to show which pixels are in threshold + // A lot of this is redundant, but this is just for demonstration purposes + display.loadPixels(); + for(int x = 0; x < kw; x++) { + for(int y = 0; y < kh; y++) { + // mirroring image + int offset = kw-x-1+y*kw; + // Raw depth + int rawDepth = depth[offset]; + + int pix = x+y*display.width; + if (rawDepth < threshold) { + // A red color instead + display.pixels[pix] = color(150,50,50); + } + else { + display.pixels[pix] = img.pixels[offset]; + } + } + } + display.updatePixels(); + + // Draw the image + image(display,0,0); + } + + void quit() { + kinect.quit(); + } + + int getThreshold() { + return threshold; + } + + void setThreshold(int t) { + threshold = t; + } +} + diff --git a/OpenKinect-Processing/examples/DepthThreshold/DepthThreshold.pde b/OpenKinect-Processing/examples/DepthThreshold/DepthThreshold.pde new file mode 100644 index 0000000..366188f --- /dev/null +++ b/OpenKinect-Processing/examples/DepthThreshold/DepthThreshold.pde @@ -0,0 +1,79 @@ +// Elie Zananiri +// Depth thresholding example +// http://www.silentlycrashing.net + +import org.openkinect.*; +import org.openkinect.processing.*; + +Kinect kinect; +int kWidth = 640; +int kHeight = 480; +int kAngle = 15; + +PImage depthImg; +int minDepth = 60; +int maxDepth = 860; + +void setup() { + size(kWidth*2, kHeight); + + kinect = new Kinect(this); + kinect.start(); + kinect.enableDepth(true); + kinect.tilt(kAngle); + + depthImg = new PImage(kWidth, kHeight); +} + +void draw() { + // draw the raw image + image(kinect.getDepthImage(), 0, 0); + + // threshold the depth image + int[] rawDepth = kinect.getRawDepth(); + for (int i=0; i < kWidth*kHeight; i++) { + if (rawDepth[i] >= minDepth && rawDepth[i] <= maxDepth) { + depthImg.pixels[i] = 0xFFFFFFFF; + } else { + depthImg.pixels[i] = 0; + } + } + + // draw the thresholded image + depthImg.updatePixels(); + image(depthImg, kWidth, 0); + + fill(0); + text("TILT: " + kAngle, 10, 20); + text("THRESHOLD: [" + minDepth + ", " + maxDepth + "]", 10, 36); +} + +void keyPressed() { + if (key == CODED) { + if (keyCode == UP) { + kAngle++; + } else if (keyCode == DOWN) { + kAngle--; + } + kAngle = constrain(kAngle, 0, 30); + kinect.tilt(kAngle); + } + + else if (key == 'a') { + minDepth = constrain(minDepth+10, 0, maxDepth); + } else if (key == 's') { + minDepth = constrain(minDepth-10, 0, maxDepth); + } + + else if (key == 'z') { + maxDepth = constrain(maxDepth+10, minDepth, 2047); + } else if (key =='x') { + maxDepth = constrain(maxDepth-10, minDepth, 2047); + } +} + +void stop() { + kinect.quit(); + super.stop(); +} + diff --git a/OpenKinect-Processing/examples/PointCloud/PointCloud.pde b/OpenKinect-Processing/examples/PointCloud/PointCloud.pde new file mode 100644 index 0000000..9d71ec4 --- /dev/null +++ b/OpenKinect-Processing/examples/PointCloud/PointCloud.pde @@ -0,0 +1,104 @@ +// Daniel Shiffman +// Kinect Point Cloud example +// http://www.shiffman.net +// https://github.com/shiffman/libfreenect/tree/master/wrappers/java/processing + +import org.openkinect.*; +import org.openkinect.processing.*; + +// Kinect Library object +Kinect kinect; + +float a = 0; + +// Size of kinect image +int w = 640; +int h = 480; + + +// We'll use a lookup table so that we don't have to repeat the math over and over +float[] depthLookUp = new float[2048]; + +void setup() { + size(800,600,P3D); + kinect = new Kinect(this); + kinect.start(); + kinect.enableDepth(true); + // We don't need the grayscale image in this example + // so this makes it more efficient + kinect.processDepthImage(false); + + // Lookup table for all possible depth values (0 - 2047) + for (int i = 0; i < depthLookUp.length; i++) { + depthLookUp[i] = rawDepthToMeters(i); + } +} + +void draw() { + + background(0); + fill(255); + textMode(SCREEN); + text("Kinect FR: " + (int)kinect.getDepthFPS() + "\nProcessing FR: " + (int)frameRate,10,16); + + // Get the raw depth as array of integers + int[] depth = kinect.getRawDepth(); + + // We're just going to calculate and draw every 4th pixel (equivalent of 160x120) + int skip = 4; + + // Translate and rotate + translate(width/2,height/2,-50); + rotateY(a); + + for(int x=0; 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 z≶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 N9Pb{4P5 + + + + + + + + + + ${ant.description} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${line} + Building the Processing library ${project.name} ${library.version} +${line} + src path ${project.src} + bin path ${project.bin} + classpath.local ${classpath.local.location} + sketchbook ${sketchbook.location} + java version ${java.target.version} +${line} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${exampleDir} + + + + + + + + + + + + + + + + + + + + + + +${line} +Name ${project.name} +Version ${library.prettyVersion} (${library.version}) +Compiled ${project.compile} +Sketchbook ${sketchbook.location} +${line} +done, finished. +${line} + + + + + diff --git a/OpenKinect-Processing/resources/code/ExampleTaglet.java b/OpenKinect-Processing/resources/code/ExampleTaglet.java new file mode 100755 index 0000000..461ea08 --- /dev/null +++ b/OpenKinect-Processing/resources/code/ExampleTaglet.java @@ -0,0 +1,231 @@ +/* + * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * -Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * -Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any + * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY + * DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR + * RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR + * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE + * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, + * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER + * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF + * THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that Software is not designed, licensed or + * intended for use in the design, construction, operation or + * maintenance of any nuclear facility. + */ + +import com.sun.tools.doclets.Taglet; +import com.sun.javadoc.*; +import java.util.Map; +import java.io.*; +/** + * A sample Taglet representing @example. This tag can be used in any kind of + * {@link com.sun.javadoc.Doc}. It is not an inline tag. The text is displayed + * in yellow to remind the developer to perform a task. For + * example, "@example Hello" would be shown as: + *
+ *
+ * To Do: + *
Fix this! + *
+ *
+ * + * @author Jamie Ho + * @since 1.4 + */ + +public class ExampleTaglet implements Taglet { + + private static final String NAME = "example"; + private static final String HEADER = "example To Do:"; + + /** + * Return the name of this custom tag. + */ + public String getName() { + return NAME; + } + + /** + * Will return true since @example + * can be used in field documentation. + * @return true since @example + * can be used in field documentation and false + * otherwise. + */ + public boolean inField() { + return true; + } + + /** + * Will return true since @example + * can be used in constructor documentation. + * @return true since @example + * can be used in constructor documentation and false + * otherwise. + */ + public boolean inConstructor() { + return true; + } + + /** + * Will return true since @example + * can be used in method documentation. + * @return true since @example + * can be used in method documentation and false + * otherwise. + */ + public boolean inMethod() { + return true; + } + + /** + * Will return true since @example + * can be used in method documentation. + * @return true since @example + * can be used in overview documentation and false + * otherwise. + */ + public boolean inOverview() { + return true; + } + + /** + * Will return true since @example + * can be used in package documentation. + * @return true since @example + * can be used in package documentation and false + * otherwise. + */ + public boolean inPackage() { + return true; + } + + /** + * Will return true since @example + * can be used in type documentation (classes or interfaces). + * @return true since @example + * can be used in type documentation and false + * otherwise. + */ + public boolean inType() { + return true; + } + + /** + * Will return false since @example + * is not an inline tag. + * @return false since @example + * is not an inline tag. + */ + + public boolean isInlineTag() { + return false; + } + + /** + * Register this Taglet. + * @param tagletMap the map to register this tag to. + */ + public static void register(Map tagletMap) { + ExampleTaglet tag = new ExampleTaglet(); + Taglet t = (Taglet) tagletMap.get(tag.getName()); + if (t != null) { + tagletMap.remove(tag.getName()); + } + tagletMap.put(tag.getName(), tag); + } + + /** + * Given the Tag representation of this custom + * tag, return its string representation. + * @param tag the Tag representation of this custom tag. + */ + public String toString(Tag tag) { + return createHTML(readFile(tag.text())); + } + + + /** + * Given an array of Tags representing this custom + * tag, return its string representation. + * @param tags the array of Tags representing of this custom tag. + */ + public String toString(Tag[] tags) { + if (tags.length == 0) { + return null; + } + return createHTML(readFile(tags[0].text())); + } + + + + String createHTML(String theString) { + if(theString!=null) { + String dd = ""; + + return dd+"\n
" + + "
+Example
" + + "
"+theString+"
" + + "
"; + } + return ""; + } + + + /** + * check if the examples directory exists and return the example as given in the tag. + * @param theExample the name of the example + */ + String readFile(String theExample) { + String record = ""; + String myResult = ""; + int recCount = 0; + String myDir = "../examples"; + File file=new File(myDir); + if(file.exists()==false) { + myDir = "./examples"; + } + try { + FileReader fr = new FileReader(myDir+"/"+theExample+"/"+theExample+".pde"); + BufferedReader br = new BufferedReader(fr); + record = new String(); + while ((record = br.readLine()) != null) { + myResult += record+"\n"; + } + } catch (IOException e) { + System.out.println(e); + return null; + } + return myResult; + } +} + + diff --git a/OpenKinect-Processing/resources/code/ant-contrib-1.0b3.jar b/OpenKinect-Processing/resources/code/ant-contrib-1.0b3.jar new file mode 100755 index 0000000000000000000000000000000000000000..062537661a514c2ce97d18948f4f25f7226cc1a0 GIT binary patch literal 224277 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 z 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%0DDNlc$iKGo<(eUp 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

0zGh%HPCY&11) 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 + + static + { + System.loadLibrary("kinect"); + } + + public static Context getContext() + { + return instance; + } + private static final Context instance = new Context(); + + // + + private final long jni; + private Logger logger; + private final Map jniMap = new HashMap(); + + private Context() + { + jni = jniInit(); + + Runtime.getRuntime().addShutdownHook(new Thread() + { + @Override + public void run() + { + List devices = new ArrayList(jniMap.values()); + for(Device device : devices) + { + device.dispose(); + } + jniShutdown(); + } + }); + } + + public int devices() + { + return jniNumDevices(); + } + + public Device getDevice(int index) + { + long dev_ptr = jniOpenDevice(index); + if(dev_ptr == 0) + { + return null; + } + Device device = new Device(this, dev_ptr); + jniMap.put(dev_ptr, device); + return device; + } + + public boolean processEvents() + { + return jniProcessEvents(); + } + + public Device device(long jni) + { + return jniMap.get(jni); + } + + public void log(Logger logger) + { + log(logger, LogLevel.INFO); + } + + public void log(Logger logger, LogLevel level) + { + jniSetLogLevel(level.ordinal()); + this.logger = logger; + } + + void disposeDevice(long dev_ptr) + { + jniMap.remove(dev_ptr); + } + + + // + + void onLog(String msg) + { + if(logger != null) + { + logger.log(msg); + } + } + + // + + // + + native private long jniInit(); + + native private void jniShutdown(); + + native private boolean jniProcessEvents(); + + native private int jniNumDevices(); + + native private long jniOpenDevice(int index); + + native private void jniSetLogLevel(int level); + + // +} diff --git a/OpenKinect-Processing/src/org/openkinect/DepthFormat.java b/OpenKinect-Processing/src/org/openkinect/DepthFormat.java new file mode 100644 index 0000000..ed7f429 --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/DepthFormat.java @@ -0,0 +1,38 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum DepthFormat +{ + RAW_11, + RAW_10, + PACKED_11, + PACKED_10; +} diff --git a/OpenKinect-Processing/src/org/openkinect/Device.java b/OpenKinect-Processing/src/org/openkinect/Device.java new file mode 100644 index 0000000..3ab2abb --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/Device.java @@ -0,0 +1,200 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @author Michael Nischt + */ +public final class Device +{ + private final Context context; + private long jni; + + private Image rgb, depth; + private Acceleration acceleration; + + Device(Context context, long jni) + { + if(context == null) + { + throw new NullPointerException(); + } + + this.context = context; + this.jni = jni; + } + + public void light(LEDStatus led) + { + checkDisposed(); + + jniSetLED(led.ordinal()); + } + + public void tilt(float deg) + { + checkDisposed(); + + jniSetTiltDegs(deg); + } + + public void color(Image image) + { + color(image,false); + } + + public void color(Image image, boolean IR) { + if (IR) { + color(image, ColorFormat.IR_10BIT); + } else { + color(image, ColorFormat.RGB_8_8_8); + } + + } + + public void color(Image image, ColorFormat format) + { + checkDisposed(); + + if (format == ColorFormat.IR_10BIT) { + // HACK FIX THIS!!! + jniSetFormatRGB(3);//format.ordinal()); + } else { + jniSetFormatRGB(format.ordinal()); + + } + rgb = image; + + if(rgb != null) + { + jniStartCaptureRGB(); + } + else + { + jniStopCaptureRGB(); + } + } + + public void depth(Image image) + { + depth(image, DepthFormat.RAW_11); + } + + public void depth(Image image, DepthFormat format) + { + checkDisposed(); + + jniSetFormatDepth(format.ordinal()); + depth = image; + + if(depth != null) + { + jniStartCaptureDepth(); + } + else + { + jniStopCaptureDepth(); + } + } + + public void acceleration(Acceleration acceleration) + { + checkDisposed(); + + this.acceleration = acceleration; + } + + public void dispose() + { + context.disposeDevice(jni); + jniClose(); + jni = 0; + } + + private void checkDisposed() + { + if(jni == 0) + { + throw new IllegalStateException("Device already dispoed."); + } + } + + // + + void onRGB(ByteBuffer buffer) + { + if (rgb != null) + { + buffer.order(ByteOrder.nativeOrder()); + rgb.data(buffer); + } + } + + void onDepth(ByteBuffer buffer) + { + if (depth != null) + { + buffer.order(ByteOrder.nativeOrder()); + depth.data(buffer); + } + } + + void onAcceleration(float x, float y, float z) + { + if (acceleration != null) + { + acceleration.direction(x, y, z); + } + } + + // + + // + + native private void jniClose(); + + native private void jniSetLED(int light); + + native private void jniSetTiltDegs(float deg); + + native private void jniSetFormatRGB(int format); + + native private void jniSetFormatDepth(int format); + + native private void jniStartCaptureRGB(); + + native private void jniStartCaptureDepth(); + + native private void jniStopCaptureRGB(); + + native private void jniStopCaptureDepth(); + + // +} diff --git a/OpenKinect-Processing/src/org/openkinect/Image.java b/OpenKinect-Processing/src/org/openkinect/Image.java new file mode 100644 index 0000000..7acb78b --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/Image.java @@ -0,0 +1,37 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +import java.nio.ByteBuffer; + +/** + * @author Michael Nischt + */ +public interface Image +{ + void data(ByteBuffer image); +} diff --git a/OpenKinect-Processing/src/org/openkinect/LEDStatus.java b/OpenKinect-Processing/src/org/openkinect/LEDStatus.java new file mode 100644 index 0000000..80106e9 --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/LEDStatus.java @@ -0,0 +1,41 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum LEDStatus +{ + LED_OFF, + LED_GREEN, + LED_RED, + LED_YELLOW, + LED_BLINK_YELLOW, + LED_BLINK_GREEN, + LED_BLINK_RED_YELLOW; +} diff --git a/OpenKinect-Processing/src/org/openkinect/LogLevel.java b/OpenKinect-Processing/src/org/openkinect/LogLevel.java new file mode 100644 index 0000000..4904b7e --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/LogLevel.java @@ -0,0 +1,42 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public enum LogLevel +{ + FATAL, + ERROR, + WARNING, + NOTICE, + INFO, + DEBUG, + SPEW, + FLOOD; +} diff --git a/OpenKinect-Processing/src/org/openkinect/Logger.java b/OpenKinect-Processing/src/org/openkinect/Logger.java new file mode 100644 index 0000000..cb445da --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/Logger.java @@ -0,0 +1,35 @@ +/* + * This file is part of the OpenKinect Project. http://www.openkinect.org + * + * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file + * for details. + * + * This code is licensed to you under the terms of the Apache License, version + * 2.0, or, at your option, the terms of the GNU General Public License, + * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses, + * or the following URLs: + * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.gnu.org/licenses/gpl-2.0.txt + * + * If you redistribute this file in source form, modified or unmodified, you + * may: + * 1) Leave this header intact and distribute it under the same terms, + * accompanying it with the APACHE20 and GPL20 files, or + * 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or + * 3) Delete the GPL v2 clause and accompany it with the APACHE20 file + * In all cases you must keep the copyright notice intact and include a copy + * of the CONTRIB file. + * + * Binary distributions must follow the binary distribution requirements of + * either License. + */ + +package org.openkinect; + +/** + * @author Michael Nischt + */ +public interface Logger +{ + void log(String msg); +} diff --git a/OpenKinect-Processing/src/org/openkinect/processing/DepthImage.java b/OpenKinect-Processing/src/org/openkinect/processing/DepthImage.java new file mode 100644 index 0000000..895b623 --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/processing/DepthImage.java @@ -0,0 +1,142 @@ +package org.openkinect.processing; + +import java.nio.ByteBuffer; +import java.nio.ShortBuffer; + +import org.openkinect.Image; + +import processing.core.PApplet; +import processing.core.PConstants; +import processing.core.PImage; + +public class DepthImage implements Image { + long time; + float fps; + + PApplet parent; + public PImage img; + + boolean processImage = true; + ShortBuffer sdata; + + public DepthImage(PApplet p) { + parent = p; + img = p.createImage(640,480,PConstants.RGB); + time = System.currentTimeMillis(); + } + + public void enableImage(boolean b) { + processImage = b; + } + + public ShortBuffer getRawData() { + return sdata; + } + + public PImage getImage() { + return img; + } + + public void data(ByteBuffer data) { + sdata = data.asShortBuffer(); + + if (processImage) { + for(int y=0; y>8) { + case 0: + b = 255; + g = 255-lb; + r = 255-lb; + break; + case 1: + b = 255; + g = lb; + r = 0; + break; + case 2: + b = 255-lb; + g = 255; + r = 0; + break; + case 3: + b = 0; + g = 255; + r = lb; + break; + case 4: + b = 0; + g = 255-lb; + r = 255; + break; + case 5: + b = 0; + g = 0; + r = 255-lb; + break; + default: + r = 0; + g = 0; + b = 0; + break; + } + + int pixel = (0xFF) << 24 + | (b & 0xFF) << 16 + | (g & 0xFF) << 8 + | (r & 0xFF) << 0; + + return pixel; + } + + static int depth2intensity(short depth) + { + int d = Math.round((1 - (depth / 2047f)) * 255f); + int pixel = (0xFF) << 24 + | (d & 0xFF) << 16 + | (d & 0xFF) << 8 + | (d & 0xFF) << 0; + + return pixel; + } + + public float getFPS() { + return fps; + } + +} diff --git a/OpenKinect-Processing/src/org/openkinect/processing/Kinect.java b/OpenKinect-Processing/src/org/openkinect/processing/Kinect.java new file mode 100644 index 0000000..e1110bc --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/processing/Kinect.java @@ -0,0 +1,156 @@ +package org.openkinect.processing; + + +import java.lang.reflect.Method; +import java.nio.ShortBuffer; + +import org.openkinect.Context; +import org.openkinect.Device; + +import processing.core.PApplet; +import processing.core.PImage; + +public class Kinect extends Thread { + + public static PApplet p5parent; + Method kinectEventMethod; + + boolean running = false; + + Context context; + Device device; + int w = 640; + int h = 480; + RGBImage kimg;// = new KImage(); + DepthImage dimg; + + public Kinect(PApplet _p) { + p5parent = _p; + try { + kinectEventMethod = p5parent.getClass().getMethod("kinectEvent", + new Class[] { Kinect.class }); + } catch (Exception e) { + //System.out.println("You are missing the kinectEvent() method. " + e); + } + //p5parent.registerDraw(this); + } + + public void start() { + start(0); + } + + public void start(int num) { + context = Context.getContext(); + if(context.devices() < 1) + { + System.out.println("No Kinect devices found."); + } + device = context.getDevice(num); + kimg = new RGBImage(p5parent); + dimg = new DepthImage(p5parent); + running = true; + super.start(); + } + + public int[] getRawDepth() { + ShortBuffer sb = dimg.getRawData(); + //int[] depth = new int[sb.capacity()]; + int[] depth = new int[w*h]; + + // This is inefficent, but I think it's easier for Processing users to have an int array? + if (sb != null) { + for (int i = 0; i < depth.length; i++) { + depth[i] = sb.get(i); + //System.out.println(sb.get(i)); + + } + } else { + // Instead of null, filling it with 0's + for (int i = 0; i < depth.length; i++) depth[i] = 0; + } + return depth; + } + + public void tilt(float deg) + { + device.tilt(deg); + } + + public void processDepthImage(boolean b) { + dimg.enableImage(b); + } + + public void enableDepth(boolean b) { + if (b) device.depth(dimg); + else device.depth(null); + } + + public void enableRGB(boolean b) { + device.color(null); + kimg.setIR(!b); + if (b) device.color(kimg); + //else device.color(null); + } + + public void enableIR(boolean b) { + device.color(null); + kimg.setIR(b); + if (b) device.color(kimg,true); + //else device.color(null); + } + + public float getVideoFPS() { + return kimg.getFPS(); + } + + public float getDepthFPS() { + return dimg.getFPS(); + } + + public PImage getVideoImage() { + return kimg.img; + //return kimg.imgCopy; + } + + public PImage getDepthImage() { + return dimg.img; + } + + + /** + * This method should only be called internally by Thread.start(). + */ + public void run() { + while (running) { + boolean b = context.processEvents(); + try { + Thread.sleep(2); + } catch (InterruptedException e) { + // e.printStackTrace(); + } + } + /*try { + // call the method with this object as the argument! + frameEventMethod.invoke(p5parent, new Object[] { this }); + + } catch (Exception e) { + err("Could not invoke the \"frameEvent()\" method for some reason."); + e.printStackTrace(); + frameEventMethod = null; + } */ + + } + + /* Stops the client thread. You don't really need to do this ever. + */ + public void quit() { + System.out.println("quitting"); + device.color(null); + device.depth(null); + running = false; // Setting running to false ends the loop in run() + //interrupt(); // In case the thread is waiting. . . + } + + + +} \ No newline at end of file diff --git a/OpenKinect-Processing/src/org/openkinect/processing/RGBImage.java b/OpenKinect-Processing/src/org/openkinect/processing/RGBImage.java new file mode 100644 index 0000000..050508f --- /dev/null +++ b/OpenKinect-Processing/src/org/openkinect/processing/RGBImage.java @@ -0,0 +1,68 @@ +package org.openkinect.processing; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; + + +import processing.core.PApplet; +import processing.core.PImage; + +public class RGBImage extends DepthImage { + boolean IR = false; + + + public RGBImage(PApplet p) { + super(p); + } + + public void setIR(boolean b) { + IR = b; + } + + public synchronized void data(ByteBuffer data) { + if (IR) { + ShortBuffer sdata = data.asShortBuffer(); + for(int y=0; y + + +##library.name## + + + + + + + + + + + + + + +

+ + \ No newline at end of file diff --git a/OpenKinect-Processing/web/stylesheet.css b/OpenKinect-Processing/web/stylesheet.css new file mode 100755 index 0000000..4348b38 --- /dev/null +++ b/OpenKinect-Processing/web/stylesheet.css @@ -0,0 +1,203 @@ +/* processingLibs style by andreas schlegel, sojamo. */ + + +* { + margin:0; + padding:0; + border:0; +} + + +body { + font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size : 100%; + font-size : 0.70em; + font-weight : normal; + line-height : normal; +} + + + +#container { + margin-left:64px; + background-color:#fff; +} + +#header { + float:left; + padding-top:24px; + padding-bottom:48px; +} + +#menu { + margin-top:16px; + float:left; + margin-bottom:64px; +} + + +#about, +#download, +#examples, +#demos, +#misc { + width:480px; + float:left; + margin-right:24px; +} + + +#resources, #info { + width:320px; + float:left; +} + + +.clear { + clear:both; +} + +#footer { + margin-top:300px; + height:20px; + margin-bottom:32px; +} + + +ul { + list-style:none; + padding:0; + margin:0; +} + + +#menu ul li, #subMenu ul li { + float:left; + padding-right:6px; +} + + + + + + +/* Headings */ + +h1 { + font-size:2em; + font-weight:normal; +} + + +h2, h3, h4, h5, th { + font-size:1.3em; + font-weight:normal; + margin-bottom:4px; +} + + + +p { + font-size:1em; + width:90%; + margin-bottom:32px; +} + + +pre, code { + font-family:"Courier New", Courier, monospace; + font-size:1em; + line-height:normal; +} + + + + +hr { + border:0; + height:1px; + margin-bottom:24px; +} + + +a { + text-decoration: underline; + font-weight: normal; +} + + +a:hover, +a:active { + text-decoration: underline; + font-weight: normal; +} + + +a:visited, +a:link:visited { + text-decoration: underline; + font-weight: normal; +} + + + +img { + border: 0px solid #000000; +} + + + + + +/* COLORS */ + + +body { + color : #333; + background-color :#fff; +} + + +#header { + background-color:#fff; + color:#333; +} + + + +h1, h2, h3, h4, h5, h6 { + color:#666; +} + + +pre, code { + color: #000000; +} + + +a,strong { + color: #333; +} + + +a:hover, +a:active { + color: #333; +} + + +a:visited, +a:link:visited { + color: #333; +} + + +#footer, #menu { + background-color:#fff; + color:#333; +} + + +#footer a, #menu a { + color:#333; +} diff --git a/README.md b/README.md new file mode 100755 index 0000000..7d884b8 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Open Kinect for Processing + +http://shiffman.net/p5/kinect/
+ + + + + +
+ +
+

##library.name##

+

+ A library by ##author.name## for the Processing programming environment.
+ Last update, ##date##. +

+

+ ##library.sentence##
+ ##library.paragraph##
+ Feel free to replace this paragraph with a description of the library.
+ Contributed libraries are developed, documented, and maintained by members of the Processing community. Further directions are included with each library. For feedback and support, please post to the Discourse. We strongly encourage all libraries to be open source, but not all of them are. +

+
+ + + +
+

Download

+

+ Download ##library.name## version ##library.prettyVersion## (##library.version##) in + .zip format. +

+

Installation

+

+ Unzip and put the extracted ##project.name## folder into the libraries folder of your Processing sketches. Reference and examples are included in the ##project.name## folder. +

+
+ + +
+

Keywords. ##library.keywords##

+

Reference. Have a look at the javadoc reference here. A copy of the reference is included in the .zip as well.

+

Source. The source code of ##library.name## is available at ##source.host##, and its repository can be browsed here.

+
+ + +
+

Examples

+

Find a list of examples in the current distribution of ##library.name##, or have a look at them by following the links below.

+
    + ##examples## +
+
+ + +
+

Tested

+

+ + Platform ##tested.platform## + + +
Processing ##tested.processingVersion## + + +
Dependencies ##library.dependencies## +

+
+ + + + + + + + + + + + +
+
+ + +