Class: Freenect::Device

Inherits:
Object
  • Object
show all
Defined in:
lib/freenect/device.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ctx, idx) ⇒ Device

Returns a new instance of Device.



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/freenect/device.rb', line 23

def initialize(ctx, idx)
  dev_p = ::FFI::MemoryPointer.new(:pointer)
  @ctx = ctx

  if ::FFI::Freenect.freenect_open_device(@ctx.context, dev_p, idx) != 0
    raise DeviceError, "unable to open device #{idx} from #{ctx.inspect}"
  end

  @dev = dev_p.read_pointer
  save_object_id!()
end

Class Method Details

.by_reference(devp) ⇒ Object

Returns a device object tracked by its ruby object reference ID stored in user data.

This method is intended for internal use.



16
17
18
19
20
21
# File 'lib/freenect/device.rb', line 16

def self.by_reference(devp)
  unless devp.null? or (refp=FFI::Freenect.freenect_get_user(devp)).null?
    obj=ObjectSpace._id2ref(refp.read_long_long)
    return obj if obj.is_a?(Device)
  end
end

Instance Method Details

#closeObject



39
40
41
42
43
44
45
# File 'lib/freenect/device.rb', line 39

def close
  unless closed?
    if ::FFI::Freenect.freenect_close_device(@dev) == 0
      @dev_closed = true
    end
  end
end

#closed?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/freenect/device.rb', line 35

def closed?
  @ctx.closed? or (@dev_closed == true)
end

#contextObject



55
56
57
# File 'lib/freenect/device.rb', line 55

def context
  @ctx
end

#depth_formatObject

returns the symbolic constant for the current depth format



148
149
150
# File 'lib/freenect/device.rb', line 148

def depth_format
  (@depth_format.is_a?(Numeric))? Freenect::DEPTH_FORMATS[@depth_format] : @depth_format
end

#deviceObject



47
48
49
50
51
52
53
# File 'lib/freenect/device.rb', line 47

def device
  if closed?
    raise DeviceError, "this device is closed and can no longer be used"
  else
    return @dev
  end
end

#get_tilt_degreesObject Also known as: tilt

Returns the current tilt angle



70
71
72
# File 'lib/freenect/device.rb', line 70

def get_tilt_degrees
  ::FFI::Freenect.freenect_get_tilt_degs(self.device)
end

#get_tilt_stateObject Also known as: tilt_state



59
60
61
62
63
64
65
# File 'lib/freenect/device.rb', line 59

def get_tilt_state
  unless (p=::FFI::Freenect.freenect_get_tilt_state(self.device)).null?
    return RawTiltState.new(p)
  else
    raise DeviceError, "freenect_get_tilt_state() returned a NULL tilt_state"
  end
end

#reference_idObject



186
187
188
189
190
# File 'lib/freenect/device.rb', line 186

def reference_id
  unless (p=::FFI::Freenect.freenect_get_user(device)).null?
    p.read_long_long
  end
end

#set_depth_callback {|device, depth_buf, timestamp| ... } ⇒ Object Also known as: on_depth

Defines a handler for depth events.

Yields:

  • (device, depth_buf, timestamp)

Yield Parameters:

  • device

    A pointer to the device that generated the event.

  • depth_buf

    A pointer to the buffer containing the depth data.

  • timestamp

    A timestamp for the event?



91
92
93
94
# File 'lib/freenect/device.rb', line 91

def set_depth_callback(&block)
  @depth_callback = block
  ::FFI::Freenect.freenect_set_depth_callback(self.device, @depth_callback)
end

#set_depth_format(fmt) ⇒ Object Also known as: depth_format=



135
136
137
138
139
140
141
142
143
# File 'lib/freenect/device.rb', line 135

def set_depth_format(fmt)
  l_fmt = fmt.is_a?(Numeric)? fmt : Freenect::DEPTH_FORMATS[fmt]
  ret = ::FFI::Freenect.freenect_set_depth_format(self.device, l_fmt)
  if (ret== 0)
    @depth_format = fmt
  else
    raise DeviceError, "Error calling freenect_set_depth_format(self, #{fmt})"
  end
end

#set_led(mode) ⇒ Object Also known as: led=

Sets the led to one of the following accepted values:

:off,               Freenect::LED_OFF
:green,             Freenect::LED_GREEN
:red,               Freenect::LED_RED
:yellow,            Freenect::LED_YELLOW
:blink_yellow,      Freenect::LED_BLINK_YELLOW
:blink_green,       Freenect::LED_BLINK_GREEN
:blink_red_yellow,  Freenect::LED_BLINK_RED_YELLOW

Either the symbol or numeric constant can be specified.



180
181
182
# File 'lib/freenect/device.rb', line 180

def set_led(mode)
  return(::FFI::Freenect.freenect_set_led(self.device, mode) == 0)
end

#set_tilt_degrees(angle) ⇒ Object Also known as: tilt=

Sets the tilt angle. Maximum tilt angle range is between +30 and -30



78
79
80
81
# File 'lib/freenect/device.rb', line 78

def set_tilt_degrees(angle)
  ::FFI::Freenect.freenect_set_tilt_degs(self.device, angle)
  return(update_tilt_state() < 0) # based on libfreenect error cond. as of 12-21-10
end

#set_video_callback {|device, video_buf, timestamp| ... } ⇒ Object Also known as: on_video

Defines a handler for video events.

Yields:

  • (device, video_buf, timestamp)

Yield Parameters:

  • device

    A pointer to the device that generated the event.

  • video_buf

    A pointer to the buffer containing the video data.

  • timestamp

    A timestamp for the event?



104
105
106
107
# File 'lib/freenect/device.rb', line 104

def set_video_callback(&block)
  @video_callback = block
  ::FFI::Freenect.freenect_set_video_callback(self.device, @video_callback)
end

#set_video_format(fmt) ⇒ Object Also known as: video_format=

Sets the video format to one of the following accepted values:



154
155
156
157
158
159
160
161
162
# File 'lib/freenect/device.rb', line 154

def set_video_format(fmt)
  l_fmt = fmt.is_a?(Numeric)? fmt : Freenect::VIDEO_FORMATS[fmt]
  ret = ::FFI::Freenect.freenect_set_video_format(self.device, l_fmt)
  if (ret== 0)
    @video_format = fmt
  else
    raise DeviceError, "Error calling freenect_set_video_format(self, #{fmt})"
  end
end

#start_depthObject



111
112
113
114
115
# File 'lib/freenect/device.rb', line 111

def start_depth
  unless(::FFI::Freenect.freenect_start_depth(self.device) == 0)
    raise DeviceError, "Error in freenect_start_depth()"
  end
end

#start_videoObject



123
124
125
126
127
# File 'lib/freenect/device.rb', line 123

def start_video
  unless(::FFI::Freenect.freenect_start_video(self.device) == 0)
    raise DeviceError, "Error in freenect_start_video()"
  end
end

#stop_depthObject



117
118
119
120
121
# File 'lib/freenect/device.rb', line 117

def stop_depth
  unless(::FFI::Freenect.freenect_stop_depth(self.device) == 0)
    raise DeviceError, "Error in freenect_stop_depth()"
  end
end

#stop_videoObject



129
130
131
132
133
# File 'lib/freenect/device.rb', line 129

def stop_video
  unless(::FFI::Freenect.freenect_stop_video(self.device) == 0)
    raise DeviceError, "Error in freenect_stop_video()"
  end
end

#video_formatObject



166
167
168
# File 'lib/freenect/device.rb', line 166

def video_format
  (@video_format.is_a?(Numeric))? ::Freenect::VIDEO_FORMATS[@video_format] : @video_format
end