ffi-gphoto2 0.2.0 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4fb2cb331909ca8e1522318738dfbfe6675c6aba
4
- data.tar.gz: d895c48398334dc8c60565b7302673244402f06d
3
+ metadata.gz: 0b41989c0a0a69883e01f7f220c8afc02a7f14a6
4
+ data.tar.gz: 437b613df85ec51ef13c28b160e0614bd84019ff
5
5
  SHA512:
6
- metadata.gz: 6dbbfd432cd4ad2516ba6ebfbeda293debd0a02587b41b5bf2d21f6c2d35c7bee9b70ed06265958158cec9a66b9b7d12c237bb636b668b289947c08c152971a8
7
- data.tar.gz: c9c4ae048625002e761f87390d7a57d664c8e471344e88395d5581910efba2ca16edc0910c3cbbbc54dbd0432ea6a766b713ee0f6add001b999fb130cc11fc10
6
+ metadata.gz: 7b0ad2ed9e8ca01acbbee01466196f787e12c2472eefbe5dc51b56ae8abafa1598546310a7dca52eb464d681f688790c8650b950d1459ce40157fc0233430e48
7
+ data.tar.gz: 9030436814f22ad5d8af8065cb8918c8f7503968afa44d745dd81720a2e4a38097ea21af371b42aa5c75289931cd13704fde8a83136211dd9a0504b57bf62f19
data/README.md CHANGED
@@ -9,7 +9,7 @@ canonical Ruby way.
9
9
  ### Prerequisites
10
10
 
11
11
  * Ruby >= 1.9
12
- * libgphoto2 >= 2.5.0 (`brew install libgphoto2`)
12
+ * libgphoto2 >= 2.5.0
13
13
 
14
14
  ### Gem
15
15
 
@@ -79,7 +79,11 @@ canonical Ruby way.
79
79
  => ["DSC_0001.JPG", "DSC_0002.JPG", ...]
80
80
 
81
81
  # save a file
82
- files.first.save
82
+ file = files.first
83
+ file.save
84
+
85
+ # and delete it
86
+ file.delete
83
87
 
84
88
  # close the camera
85
89
  camera.finalize
@@ -0,0 +1,30 @@
1
+ # The camera must have a `movie` config key for this to work.
2
+ #
3
+ # Unlike capturing photos, which typically save to internal memory, videos
4
+ # save to the memory card. The next `file_added` event from the camera after
5
+ # stopping the recording will contain data pointing to the video file.
6
+
7
+ require 'gphoto2'
8
+
9
+ camera = GPhoto2::Camera.first
10
+
11
+ begin
12
+ # start recording
13
+ camera.update(movie: true)
14
+
15
+ # record for ~10 seconds
16
+ sleep 10
17
+
18
+ # stop recording
19
+ camera.update(movie: false)
20
+
21
+ # wait for the camera to finish with the file
22
+ begin
23
+ event = camera.wait
24
+ end until event.type == :file_added
25
+
26
+ # the event data has a camera file that can be saved
27
+ event.data.save
28
+ ensure
29
+ camera.finalize
30
+ end
data/lib/ffi/gphoto2.rb CHANGED
@@ -52,6 +52,7 @@ module FFI
52
52
  attach_function :gp_camera_folder_list_files, [Camera.by_ref, :string, CameraList.by_ref, GPContext.by_ref], :int
53
53
  attach_function :gp_camera_folder_list_folders, [Camera.by_ref, :string, CameraList.by_ref, GPContext.by_ref], :int
54
54
  attach_function :gp_camera_file_get, [Camera.by_ref, :string, :string, CameraFileType, CameraFile.by_ref, GPContext.by_ref], :int
55
+ attach_function :gp_camera_file_delete, [Camera.by_ref, :string, :string, GPContext.by_ref], :int
55
56
 
56
57
  # gphoto2/gphoto2-context.h
57
58
  attach_function :gp_context_new, [], :pointer
@@ -2,15 +2,18 @@ module GPhoto2
2
2
  class Camera
3
3
  include FFI::GPhoto2
4
4
 
5
- attr_reader :context, :model, :port
5
+ attr_reader :context, :port
6
6
 
7
7
  def self.all
8
8
  context = Context.new
9
9
 
10
- camera_abilities_list = CameraAbilitiesList.new(context)
11
- camera_list = camera_abilities_list.detect
10
+ abilities = CameraAbilitiesList.new(context)
11
+ cameras = abilities.detect
12
12
 
13
- entries = camera_list.to_a.map { |entry| Camera.new(entry) }
13
+ entries = cameras.to_a.map do |entry|
14
+ model, port = entry.name, entry.value
15
+ Camera.new(port, model)
16
+ end
14
17
 
15
18
  context.finalize
16
19
 
@@ -23,8 +26,8 @@ module GPhoto2
23
26
  entries.first
24
27
  end
25
28
 
26
- def self.open(entry)
27
- camera = new(entry)
29
+ def self.open(port, model = nil)
30
+ camera = new(port, model)
28
31
 
29
32
  if block_given?
30
33
  begin
@@ -41,8 +44,8 @@ module GPhoto2
41
44
  all.select { |c| c.model.match(pattern) }
42
45
  end
43
46
 
44
- def initialize(entry)
45
- @model, @port = entry.name, entry.value
47
+ def initialize(port, model = nil)
48
+ @port, @model = port, model
46
49
  @dirty = false
47
50
  end
48
51
 
@@ -73,6 +76,19 @@ module GPhoto2
73
76
  wait_for_event(timeout)
74
77
  end
75
78
 
79
+ def model
80
+ @model ||= begin
81
+ abilities = CameraAbilitiesList.new(context).detect
82
+ cameras = abilities.detect
83
+
84
+ entry = cameras.map(&:value).find { |port| port == @port }
85
+
86
+ raise RuntimeError, "no camera found on port #{@port}" if entry.nil?
87
+
88
+ entry.name
89
+ end
90
+ end
91
+
76
92
  def ptr
77
93
  @ptr || (init && @ptr)
78
94
  end
@@ -107,8 +123,12 @@ module GPhoto2
107
123
  file_get(file)
108
124
  end
109
125
 
126
+ def delete(file)
127
+ file_delete(file)
128
+ end
129
+
110
130
  def [](key)
111
- config[key]
131
+ config[key.to_s]
112
132
  end
113
133
 
114
134
  def []=(key, value)
@@ -117,6 +137,14 @@ module GPhoto2
117
137
  value
118
138
  end
119
139
 
140
+ def update(attributes = {})
141
+ attributes.each do |key, value|
142
+ self[key] = value
143
+ end
144
+
145
+ save
146
+ end
147
+
120
148
  def dirty?
121
149
  @dirty
122
150
  end
@@ -197,6 +225,11 @@ module GPhoto2
197
225
  file
198
226
  end
199
227
 
228
+ def file_delete(file)
229
+ rc = gp_camera_file_delete(ptr, file.folder, file.name, context.ptr)
230
+ GPhoto2.check!(rc)
231
+ end
232
+
200
233
  def unref
201
234
  rc = gp_camera_unref(ptr)
202
235
  GPhoto2.check!(rc)
@@ -210,10 +243,29 @@ module GPhoto2
210
243
  data_ptr = FFI::MemoryPointer.new(:pointer)
211
244
  data_ptr.write_pointer(data)
212
245
 
213
- rc = gp_camera_wait_for_event(ptr, timeout, type, data, context.ptr)
246
+ rc = gp_camera_wait_for_event(ptr, timeout, type, data_ptr, context.ptr)
214
247
  GPhoto2.check!(rc)
215
248
 
216
- CameraEventType[type.read_int]
249
+ type = CameraEventType[type.read_int]
250
+ data = data_ptr.read_pointer
251
+
252
+ data =
253
+ case type
254
+ when :unknown
255
+ data.null? ? nil : data.read_string
256
+ when :file_added
257
+ path_ptr = FFI::GPhoto2::CameraFilePath.new(data)
258
+ path = CameraFilePath.new(path_ptr)
259
+ CameraFile.new(self, path.folder, path.name)
260
+ when :folder_added
261
+ path_ptr = FFI::GPhoto2::CameraFilePath.new(data)
262
+ path = CameraFilePath.new(path_ptr)
263
+ CameraFolder.new(self, '%s/%s' % [path.folder, path.name])
264
+ else
265
+ nil
266
+ end
267
+
268
+ CameraEvent.new(type, data)
217
269
  end
218
270
  end
219
271
  end
@@ -0,0 +1,10 @@
1
+ module GPhoto2
2
+ class CameraEvent
3
+ attr_reader :type, :data
4
+
5
+ def initialize(type, data)
6
+ @type = type
7
+ @data = data
8
+ end
9
+ end
10
+ end
@@ -18,6 +18,10 @@ module GPhoto2
18
18
  File.binwrite(pathname, data)
19
19
  end
20
20
 
21
+ def delete
22
+ @camera.delete(self)
23
+ end
24
+
21
25
  def data
22
26
  data_and_size.first
23
27
  end
@@ -2,8 +2,8 @@ module GPhoto2
2
2
  class CameraFilePath
3
3
  attr_reader :ptr
4
4
 
5
- def initialize
6
- @ptr = FFI::GPhoto2::CameraFilePath.new
5
+ def initialize(ptr = nil)
6
+ @ptr = ptr || FFI::GPhoto2::CameraFilePath.new
7
7
  end
8
8
 
9
9
  def name
@@ -1,3 +1,3 @@
1
1
  module GPhoto2
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
data/lib/gphoto2.rb CHANGED
@@ -17,6 +17,7 @@ require 'gphoto2/camera_widgets/window_camera_widget'
17
17
  require 'gphoto2/camera'
18
18
  require 'gphoto2/camera_abilities'
19
19
  require 'gphoto2/camera_abilities_list'
20
+ require 'gphoto2/camera_event'
20
21
  require 'gphoto2/camera_file'
21
22
  require 'gphoto2/camera_file_path'
22
23
  require 'gphoto2/camera_folder'
@@ -52,6 +52,14 @@ module GPhoto2
52
52
  end
53
53
  end
54
54
 
55
+ describe '#delete' do
56
+ it 'delegates the deletion of the file to the camera' do
57
+ file = CameraFile.new(camera, folder, name)
58
+ expect(camera).to receive(:delete).with(file)
59
+ file.delete
60
+ end
61
+ end
62
+
55
63
  describe '#data' do
56
64
  it 'returns the data of the camera file' do
57
65
  file = CameraFile.new(camera, folder, name)
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module GPhoto2
4
4
  describe Camera do
5
- let(:port) { double('entry', name: 'model', value: 'usb:250,006') }
5
+ let(:port) { 'usb:250,006' }
6
6
 
7
7
  describe '.all' do
8
8
  let(:abilities_list) { double('camera_abilities_list') }
@@ -13,7 +13,7 @@ module GPhoto2
13
13
  Context.stub(:stub)
14
14
  CameraAbilitiesList.stub(:new).and_return(abilities_list)
15
15
  abilities_list.stub(:detect).and_return(camera_list)
16
- camera_list.stub(:to_a).and_return([port])
16
+ camera_list.stub_chain(:to_a, :map).and_return([camera])
17
17
  end
18
18
 
19
19
  it 'returns a list of device entries' do
@@ -192,6 +192,15 @@ module GPhoto2
192
192
  end
193
193
  end
194
194
 
195
+ describe '#delete' do
196
+ it 'deletes a file from the camera' do
197
+ camera = Camera.new(port)
198
+ camera.stub(:file_delete)
199
+ expect(camera).to receive(:file_delete)
200
+ camera.delete(double('camera_file'))
201
+ end
202
+ end
203
+
195
204
  describe '#[]' do
196
205
  let(:window) { double('camera_widget') }
197
206
 
@@ -227,7 +236,7 @@ module GPhoto2
227
236
  camera
228
237
  end
229
238
 
230
- it "set a widget's value" do
239
+ it "sets a widget's value" do
231
240
  camera['iso'] = 400
232
241
  end
233
242
 
@@ -241,6 +250,25 @@ module GPhoto2
241
250
  end
242
251
  end
243
252
 
253
+ describe '#update' do
254
+ let(:camera) do
255
+ camera = Camera.new(port)
256
+ camera.stub(:[]=)
257
+ camera.stub(:save)
258
+ camera
259
+ end
260
+
261
+ it 'sets one or more camera setting' do
262
+ expect(camera).to receive(:[]=).exactly(2).times
263
+ camera.update('iso' => 400, 'shutterspeed2' => '1/30')
264
+ end
265
+
266
+ it 'immediately saves the settings to the camera' do
267
+ expect(camera).to receive(:save)
268
+ camera.update
269
+ end
270
+ end
271
+
244
272
  describe '#dirty?' do
245
273
  context 'when the configuration changed' do
246
274
  it 'returns true' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-gphoto2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Macias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-02 00:00:00.000000000 Z
11
+ date: 2013-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -81,6 +81,7 @@ files:
81
81
  - Rakefile
82
82
  - examples/intervalometer.rb
83
83
  - examples/live_view.rb
84
+ - examples/record_movie.rb
84
85
  - ffi-gphoto2.gemspec
85
86
  - lib/ffi/gphoto2.rb
86
87
  - lib/ffi/gphoto2/camera.rb
@@ -111,6 +112,7 @@ files:
111
112
  - lib/gphoto2/camera.rb
112
113
  - lib/gphoto2/camera_abilities.rb
113
114
  - lib/gphoto2/camera_abilities_list.rb
115
+ - lib/gphoto2/camera_event.rb
114
116
  - lib/gphoto2/camera_file.rb
115
117
  - lib/gphoto2/camera_file_path.rb
116
118
  - lib/gphoto2/camera_folder.rb