hornetseye-kinect 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -64,36 +64,16 @@ Here is another example displaying RGB and the depth image while keeping the til
64
64
  require 'hornetseye_kinect'
65
65
  require 'hornetseye_xorg'
66
66
  include Hornetseye
67
- class Numeric
68
- def clip( range )
69
- [ [ self, range.begin ].max, range.end ].min
70
- end
71
- end
72
- colours = Sequence.ubytergb 256
73
- for i in 0...256
74
- hue = 240 - i * 240.0 / 256.0
75
- colours[i] =
76
- RGB( ( ( hue - 180 ).abs - 60 ).clip( 0...60 ) * 0xFF / 60.0,
77
- ( 120 - ( hue - 120 ).abs ).clip( 0...60 ) * 0xFF / 60.0,
78
- ( 120 - ( hue - 240 ).abs ).clip( 0...60 ) * 0xFF / 60.0 )
79
- end
80
67
  input = KinectInput.new
81
- display = X11Display.new
82
- output_depth, output_video = XImageOutput.new, XVideoOutput.new
83
- window_depth = X11Window.new display, output_depth, 640, 480
84
- window_video = X11Window.new display, output_video, 640, 480
85
- window_depth.title = 'Depth'
86
- window_video.title = 'Video'
87
- window_depth.show
88
- window_video.show
89
68
  input.led = KinectInput::LED_RED
90
- while display.status?
69
+ img = MultiArray.ubytergb 1280, 480
70
+ X11Display.show :output => XVideoOutput do
71
+ img[ 0 ... 640, 0 ... 480 ] = input.read_video
72
+ img[ 640 ... 1280, 0 ... 480 ] = ( input.read_depth >> 2 ).clip
91
73
  input.tilt = 0.0
92
74
  input.get_state
93
75
  moving = input.tilt_status == KinectInput::TILT_STATUS_MOVING
94
76
  input.led = moving ? KinectInput::LED_RED : KinectInput::LED_GREEN
95
- output_video.write input.read_video
96
- output_depth.write( ( input.read_depth >> 3 ).lut colours )
97
- display.process_events
77
+ img
98
78
  end
99
79
 
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ require 'rake/loaders/makefile'
7
7
  require 'rbconfig'
8
8
 
9
9
  PKG_NAME = 'hornetseye-kinect'
10
- PKG_VERSION = '0.2.0'
10
+ PKG_VERSION = '0.2.1'
11
11
  CFG = RbConfig::CONFIG
12
12
  CXX = ENV[ 'CXX' ] || 'g++'
13
13
  RB_FILES = FileList[ 'lib/**/*.rb' ]
data/ext/kinectcontext.cc CHANGED
@@ -26,10 +26,11 @@ using namespace std;
26
26
  VALUE KinectContext::cRubyClass = Qnil;
27
27
 
28
28
  KinectContext::KinectContext(void) throw (Error):
29
- m_context(NULL), m_mutex(PTHREAD_MUTEX_INITIALIZER), m_cond(PTHREAD_COND_INITIALIZER),
30
- m_instances(0)
29
+ m_usb(NULL), m_context(NULL), m_mutex(PTHREAD_MUTEX_INITIALIZER),
30
+ m_cond(PTHREAD_COND_INITIALIZER), m_instances(0)
31
31
  {
32
- freenect_init( &m_context, NULL );
32
+ ERRORMACRO( libusb_init( &m_usb ) == 0, Error, , "Error creating libusb session" );
33
+ freenect_init( &m_context, m_usb );
33
34
  ERRORMACRO( m_context != NULL, Error, , "Initialisation of libfreenect failed" );
34
35
  }
35
36
 
@@ -63,6 +64,10 @@ void KinectContext::close(void)
63
64
  freenect_shutdown( m_context );
64
65
  m_context = NULL;
65
66
  };
67
+ if ( m_usb != NULL ) {
68
+ libusb_exit( m_usb );
69
+ m_usb = NULL;
70
+ };
66
71
  }
67
72
 
68
73
  freenect_context *KinectContext::get(void) throw (Error)
@@ -77,9 +82,13 @@ void KinectContext::lock(void)
77
82
  pthread_mutex_lock( &m_mutex );
78
83
  }
79
84
 
80
- void KinectContext::wait(void)
85
+ void KinectContext::wait(void) throw (Error)
81
86
  {
82
- processEvents();
87
+ struct timeval tv;
88
+ tv.tv_sec = 1;
89
+ tv.tv_usec = 0;
90
+ ERRORMACRO( libusb_handle_events_timeout( m_usb, &tv ) == 0, Error, ,
91
+ "Error processing USB events" );
83
92
  }
84
93
 
85
94
  void KinectContext::unlock(void)
@@ -87,12 +96,6 @@ void KinectContext::unlock(void)
87
96
  pthread_mutex_unlock( &m_mutex );
88
97
  }
89
98
 
90
- void KinectContext::processEvents(void) throw (Error)
91
- {
92
- ERRORMACRO( freenect_process_events( m_context ) >= 0, Error, , "Error processing "
93
- "USB events" );
94
- }
95
-
96
99
  string KinectContext::inspect(void) const
97
100
  {
98
101
  ostringstream s;
@@ -105,9 +108,12 @@ void KinectContext::threadFunc(void)
105
108
  bool quit = false;
106
109
  while ( !quit ) {
107
110
  lock();
108
- if ( m_instances > 0 )
109
- processEvents();
110
- else {
111
+ if ( m_instances > 0 ) {
112
+ try {
113
+ wait();
114
+ } catch ( Error &e ) {
115
+ };
116
+ } else {
111
117
  pthread_cond_signal( &m_cond );
112
118
  quit = true;
113
119
  };
data/ext/kinectcontext.hh CHANGED
@@ -30,10 +30,9 @@ public:
30
30
  void close(void);
31
31
  void addInstance(void);
32
32
  void removeInstance(void);
33
- void processEvents(void) throw (Error);
34
33
  freenect_context *get(void) throw (Error);
35
34
  void lock(void);
36
- void wait(void);
35
+ void wait(void) throw (Error);
37
36
  void unlock(void);
38
37
  static VALUE cRubyClass;
39
38
  static VALUE registerRubyClass( VALUE module );
@@ -43,6 +42,7 @@ public:
43
42
  protected:
44
43
  void threadFunc(void);
45
44
  static void *staticThreadFunc( void *self );
45
+ libusb_context *m_usb;
46
46
  freenect_context *m_context;
47
47
  pthread_t m_thread;
48
48
  pthread_mutex_t m_mutex;
data/ext/kinectinput.cc CHANGED
@@ -85,11 +85,16 @@ FramePtr KinectInput::readVideo(void) throw (Error)
85
85
  ERRORMACRO( m_device != NULL, Error, , "Kinect device is not open. "
86
86
  "Did you call \"close\" before?" );
87
87
  m_context->lock();
88
- while ( !m_haveRGB ) m_context->wait();
89
- m_haveRGB = false;
90
- char *data = m_rgb[ 2 ];
91
- m_rgb[ 2 ] = m_rgb[ 1 - m_currentRGB ];
92
- m_rgb[ 1 - m_currentRGB ] = data;
88
+ try {
89
+ while ( !m_haveRGB ) m_context->wait();
90
+ m_haveRGB = false;
91
+ char *data = m_rgb[ 2 ];
92
+ m_rgb[ 2 ] = m_rgb[ 1 - m_currentRGB ];
93
+ m_rgb[ 1 - m_currentRGB ] = data;
94
+ } catch ( Error &e ) {
95
+ m_context->unlock();
96
+ throw e;
97
+ };
93
98
  m_context->unlock();
94
99
  FramePtr retVal = FramePtr
95
100
  ( new Frame( "UBYTERGB", FREENECT_FRAME_W, FREENECT_FRAME_H, m_rgb[ 2 ] ) );
@@ -101,11 +106,16 @@ FramePtr KinectInput::readDepth(void) throw (Error)
101
106
  ERRORMACRO( m_device != NULL, Error, , "Kinect device is not open. "
102
107
  "Did you call \"close\" before?" );
103
108
  m_context->lock();
104
- while ( !m_haveDepth ) m_context->wait();
105
- m_haveDepth = false;
106
- char *data = m_depth[ 2 ];
107
- m_depth[ 2 ] = m_depth[ 1 - m_currentDepth ];
108
- m_depth[ 1 - m_currentDepth ] = data;
109
+ try {
110
+ while ( !m_haveDepth ) m_context->wait();
111
+ m_haveDepth = false;
112
+ char *data = m_depth[ 2 ];
113
+ m_depth[ 2 ] = m_depth[ 1 - m_currentDepth ];
114
+ m_depth[ 1 - m_currentDepth ] = data;
115
+ } catch ( Error &e ) {
116
+ m_context->unlock();
117
+ throw e;
118
+ };
109
119
  m_context->unlock();
110
120
  FramePtr retVal = FramePtr
111
121
  ( new Frame( "USINT", FREENECT_FRAME_W, FREENECT_FRAME_H, m_depth[ 2 ] ) );
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 0
9
- version: 0.2.0
8
+ - 1
9
+ version: 0.2.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jan Wedekind
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-03-11 00:00:00 +00:00
17
+ date: 2011-03-14 00:00:00 +00:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency