gphoto4ruby 0.1.2 → 0.1.3
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/CHANGELOG.rdoc +7 -1
- data/README.rdoc +13 -9
- data/example.rb +6 -6
- data/ext/gphoto4ruby.c +296 -346
- data/ext/gphoto4ruby.h +7 -5
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
==
|
1
|
+
== 0.1.3
|
2
2
|
|
3
3
|
* Added "delete file from camera" function
|
4
|
+
* Directive :type and class constant to determine config type
|
5
|
+
* "Configs" is now "config" (method name change)
|
6
|
+
* Configs are now cached in instance variable
|
7
|
+
* Added config_merge method
|
8
|
+
* ProgrammerError removed
|
9
|
+
* Removed allowed values check. Values just dont change instead of raising Errors
|
4
10
|
|
5
11
|
== 0.1.2
|
6
12
|
|
data/README.rdoc
CHANGED
@@ -41,9 +41,13 @@ calling object methods.
|
|
41
41
|
|
42
42
|
== Usage
|
43
43
|
|
44
|
-
After installation of this gem rdocs are generated for you.
|
45
|
-
|
46
|
-
|
44
|
+
After installation of this gem rdocs are generated for you. Or you can generate
|
45
|
+
it manually with:
|
46
|
+
|
47
|
+
rake rdoc
|
48
|
+
|
49
|
+
Ruby file <b>example.rb</b> is installed along with this gem. All examples are
|
50
|
+
tested on Kubuntu 8.04 and Mac OS X 10.4.11 with digital camera Nikon DSC D80
|
47
51
|
connected through usb in PTP mode.
|
48
52
|
|
49
53
|
<b>example.rb:</b>
|
@@ -61,9 +65,9 @@ connected through usb in PTP mode.
|
|
61
65
|
|
62
66
|
# list available configuration items with current values and lists
|
63
67
|
# of allowed values
|
64
|
-
c.
|
65
|
-
puts
|
66
|
-
puts "values available are: " + c[
|
68
|
+
c.config.each_key do |cfg_key|
|
69
|
+
puts cfg_key + " value is: " + c.config[cfg_key].to_s # or c[cfg_key].to_s
|
70
|
+
puts "values available are: " + c[cfg_key, :all].inspect
|
67
71
|
end
|
68
72
|
|
69
73
|
# capture image
|
@@ -88,9 +92,9 @@ connected through usb in PTP mode.
|
|
88
92
|
ports.each do |port|
|
89
93
|
c = GPhoto2::Camera.new(port)
|
90
94
|
puts "camera in port: " + port
|
91
|
-
c.
|
92
|
-
puts
|
93
|
-
puts "values available are: " + c[
|
95
|
+
c.config.each_key do |cfg_key|
|
96
|
+
puts cfg_key + " value is: " + c[cfg_key].to_s
|
97
|
+
puts "values available are: " + c[cfg_key, :all].inspect
|
94
98
|
end
|
95
99
|
cams.push c
|
96
100
|
end
|
data/example.rb
CHANGED
@@ -11,9 +11,9 @@ if ports.empty?
|
|
11
11
|
|
12
12
|
# list available configuration items with current values and lists
|
13
13
|
# of allowed values
|
14
|
-
c.
|
15
|
-
puts
|
16
|
-
puts "values available are: " + c[
|
14
|
+
c.config.each_key do |cfg_key|
|
15
|
+
puts cfg_key + " value is: " + c.config[cfg_key].to_s # or c[cfg_key].to_s
|
16
|
+
puts "values available are: " + c[cfg_key, :all].inspect
|
17
17
|
end
|
18
18
|
|
19
19
|
# capture image
|
@@ -38,9 +38,9 @@ else
|
|
38
38
|
ports.each do |port|
|
39
39
|
c = GPhoto2::Camera.new(port)
|
40
40
|
puts "camera in port: " + port
|
41
|
-
c.
|
42
|
-
puts
|
43
|
-
puts "values available are: " + c[
|
41
|
+
c.config.each_key do |cfg_key|
|
42
|
+
puts cfg_key + " value is: " + c[cfg_key].to_s
|
43
|
+
puts "values available are: " + c[cfg_key, :all].inspect
|
44
44
|
end
|
45
45
|
cams.push c
|
46
46
|
end
|
data/ext/gphoto4ruby.c
CHANGED
@@ -32,166 +32,129 @@ static void rb_raise_gp_result(int retval) {
|
|
32
32
|
rb_raise(rb_cGPhoto2Exception, "LibGPhoto2 function returned: %s", gp_result_as_string(retval));
|
33
33
|
}
|
34
34
|
|
35
|
-
static
|
36
|
-
|
35
|
+
static int gp_result_check(int retval) {
|
36
|
+
if (retval < GP_OK) {
|
37
|
+
rb_raise_gp_result(retval);
|
38
|
+
}
|
39
|
+
return retval;
|
37
40
|
}
|
38
41
|
|
39
42
|
static VALUE getRadio(CameraWidget *cc) {
|
40
|
-
int retval;
|
41
43
|
const char *val;
|
42
|
-
|
43
|
-
|
44
|
-
return rb_str_new2(val);
|
45
|
-
} else {
|
46
|
-
rb_raise_gp_result(retval);
|
47
|
-
return Qnil;
|
48
|
-
}
|
44
|
+
gp_result_check(gp_widget_get_value(cc, &val));
|
45
|
+
return rb_str_new2(val);
|
49
46
|
}
|
50
47
|
|
51
48
|
static VALUE listRadio(CameraWidget *cc) {
|
52
|
-
int
|
49
|
+
int i, choicesTotal;
|
53
50
|
const char *choice;
|
54
51
|
VALUE arr;
|
55
52
|
|
56
|
-
choicesTotal = gp_widget_count_choices(cc);
|
53
|
+
choicesTotal = gp_result_check(gp_widget_count_choices(cc));
|
57
54
|
arr = rb_ary_new();
|
58
55
|
for (i = 0; i < choicesTotal; i++) {
|
59
|
-
|
60
|
-
|
61
|
-
rb_ary_push(arr, rb_str_new2(choice));
|
62
|
-
} else {
|
63
|
-
rb_raise_gp_result(retval);
|
64
|
-
return Qnil;
|
65
|
-
}
|
56
|
+
gp_result_check(gp_widget_get_choice(cc, i, &choice));
|
57
|
+
rb_ary_push(arr, rb_str_new2(choice));
|
66
58
|
}
|
67
59
|
return arr;
|
68
60
|
|
69
|
-
static VALUE setRadio(GPhoto2Camera *c, VALUE newVal) {
|
70
|
-
int
|
71
|
-
const char *choice;
|
61
|
+
static VALUE setRadio(VALUE self, GPhoto2Camera *c, VALUE newVal, int save) {
|
62
|
+
int i, choicesTotal;
|
72
63
|
const char *val;
|
73
64
|
|
74
65
|
Check_Type(newVal, T_STRING);
|
75
66
|
val = RSTRING(newVal)->ptr;
|
76
67
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
if (strcmp(choice, val) == 0) {
|
81
|
-
retval = gp_widget_set_value(c->childConfig, val);
|
82
|
-
if (retval == GP_OK) {
|
83
|
-
retval = gp_camera_set_config(c->camera, c->config, c->context);
|
84
|
-
if (retval == GP_OK) {
|
85
|
-
return newVal;
|
86
|
-
}
|
87
|
-
}
|
88
|
-
}
|
89
|
-
}
|
90
|
-
if (retval != GP_OK) {
|
91
|
-
rb_raise_gp_result(retval);
|
92
|
-
} else {
|
93
|
-
rb_raise(rb_cGPhoto2ConfigurationError, "Value '%s' is not allowed", val);
|
68
|
+
gp_result_check(gp_widget_set_value(c->childConfig, val));
|
69
|
+
if (save) {
|
70
|
+
saveConfigs(self, c);
|
94
71
|
}
|
95
|
-
return
|
72
|
+
return newVal;
|
96
73
|
}
|
97
74
|
|
98
75
|
static VALUE getRange(CameraWidget *cc) {
|
99
|
-
int retval;
|
100
76
|
float val;
|
101
|
-
|
102
|
-
|
103
|
-
return rb_float_new(val);
|
104
|
-
} else {
|
105
|
-
rb_raise_gp_result(retval);
|
106
|
-
return Qnil;
|
107
|
-
}
|
77
|
+
gp_result_check(gp_widget_get_value(cc, &val));
|
78
|
+
return rb_float_new(val);
|
108
79
|
}
|
109
80
|
|
110
81
|
static VALUE listRange(CameraWidget *cc) {
|
111
|
-
int retval;
|
112
82
|
float min, max, inc, i;
|
113
83
|
VALUE arr;
|
114
84
|
|
115
|
-
|
116
|
-
|
117
|
-
|
85
|
+
gp_result_check(gp_widget_get_range(cc, &min, &max, &inc));
|
86
|
+
arr = rb_ary_new();
|
87
|
+
if (inc > 0) {
|
118
88
|
for (i = min; i <= max; i = i + inc) {
|
119
89
|
rb_ary_push(arr, rb_float_new(i));
|
120
90
|
}
|
121
|
-
return arr;
|
122
|
-
} else if (retval != GP_OK) {
|
123
|
-
rb_raise_gp_result(retval);
|
124
91
|
} else {
|
125
|
-
|
92
|
+
rb_ary_push(arr, rb_float_new(min));
|
126
93
|
}
|
127
|
-
return
|
94
|
+
return arr;
|
128
95
|
}
|
129
96
|
|
130
|
-
static VALUE setRange(GPhoto2Camera *c, VALUE newNum) {
|
131
|
-
int retval;
|
132
|
-
float min, max, inc, i;
|
97
|
+
static VALUE setRange(VALUE self, GPhoto2Camera *c, VALUE newNum, int save) {
|
133
98
|
float val;
|
134
99
|
|
135
100
|
Check_Type(newNum, T_FLOAT);
|
136
101
|
val = NUM2DBL(newNum);
|
137
102
|
|
138
|
-
|
139
|
-
if (
|
140
|
-
|
141
|
-
if ((val >= i) && (val <= (i+inc))) {
|
142
|
-
if ((val - i) > (inc / 2.0)) {
|
143
|
-
val = i + inc;
|
144
|
-
} else {
|
145
|
-
val = i;
|
146
|
-
}
|
147
|
-
retval = gp_widget_set_value(c->childConfig, &val);
|
148
|
-
if (retval == GP_OK) {
|
149
|
-
retval = gp_camera_set_config(c->camera, c->config, c->context);
|
150
|
-
if (retval == GP_OK) {
|
151
|
-
return rb_float_new(val);
|
152
|
-
}
|
153
|
-
}
|
154
|
-
}
|
155
|
-
}
|
156
|
-
}
|
157
|
-
if (retval != GP_OK) {
|
158
|
-
rb_raise_gp_result(retval);
|
159
|
-
} else {
|
160
|
-
rb_raise(rb_cGPhoto2ConfigurationError, "Value has to be in range: %f .. %f", min, max);
|
103
|
+
gp_result_check(gp_widget_set_value(c->childConfig, &val));
|
104
|
+
if (save) {
|
105
|
+
saveConfigs(self, c);
|
161
106
|
}
|
162
|
-
return
|
107
|
+
return newNum;
|
163
108
|
}
|
164
109
|
|
165
|
-
static void
|
166
|
-
|
167
|
-
const char *name;
|
168
|
-
CameraWidget *child;
|
110
|
+
static void saveConfigs(VALUE self, GPhoto2Camera *c) {
|
111
|
+
VALUE cfgs, cfg_changed, name;
|
169
112
|
CameraWidgetType widgettype;
|
170
113
|
|
171
|
-
|
172
|
-
|
114
|
+
gp_result_check(gp_camera_set_config(c->camera, c->config, c->context));
|
115
|
+
gp_result_check(gp_camera_get_config(c->camera, &(c->config), c->context));
|
116
|
+
cfg_changed = rb_iv_get(self, "@configs_changed");
|
117
|
+
cfgs = rb_iv_get(self, "@configuration");
|
118
|
+
name = rb_ary_shift(cfg_changed);
|
119
|
+
while (TYPE(name) != T_NIL) {
|
120
|
+
gp_result_check(gp_widget_get_child_by_name(c->config, RSTRING(name)->ptr, &(c->childConfig)));
|
121
|
+
gp_result_check(gp_widget_get_type(c->childConfig, &widgettype));
|
173
122
|
switch (widgettype) {
|
174
123
|
case GP_WIDGET_RADIO:
|
175
|
-
|
176
|
-
retval = gp_widget_get_name(cc, &name);
|
177
|
-
if (retval == GP_OK) {
|
178
|
-
rb_ary_push(arr, rb_str_new2(name));
|
179
|
-
}
|
124
|
+
rb_hash_aset(cfgs, name, getRadio(c->childConfig));
|
180
125
|
break;
|
181
|
-
case
|
182
|
-
|
183
|
-
childrenTotal = gp_widget_count_children(cc);
|
184
|
-
for (i = 0; i < childrenTotal; i ++) {
|
185
|
-
retval = gp_widget_get_child(cc, i, &child);
|
186
|
-
if (retval == GP_OK) {
|
187
|
-
populateWithConfigs(child, arr);
|
188
|
-
}
|
189
|
-
}
|
126
|
+
case GP_WIDGET_RANGE:
|
127
|
+
rb_hash_aset(cfgs, name, getRange(c->childConfig));
|
190
128
|
break;
|
191
129
|
}
|
130
|
+
name = rb_ary_shift(cfg_changed);
|
192
131
|
}
|
193
|
-
|
194
|
-
|
132
|
+
}
|
133
|
+
|
134
|
+
static void populateWithConfigs(CameraWidget *cc, VALUE hash) {
|
135
|
+
int i, childrenTotal;
|
136
|
+
const char *name;
|
137
|
+
CameraWidget *child;
|
138
|
+
CameraWidgetType widgettype;
|
139
|
+
|
140
|
+
gp_result_check(gp_widget_get_type(cc, &widgettype));
|
141
|
+
switch (widgettype) {
|
142
|
+
case GP_WIDGET_RADIO:
|
143
|
+
gp_result_check(gp_widget_get_name(cc, &name));
|
144
|
+
rb_hash_aset(hash, rb_str_new2(name), getRadio(cc));
|
145
|
+
break;
|
146
|
+
case GP_WIDGET_RANGE:
|
147
|
+
gp_result_check(gp_widget_get_name(cc, &name));
|
148
|
+
rb_hash_aset(hash, rb_str_new2(name), getRange(cc));
|
149
|
+
break;
|
150
|
+
case GP_WIDGET_WINDOW:
|
151
|
+
case GP_WIDGET_SECTION:
|
152
|
+
childrenTotal = gp_result_check(gp_widget_count_children(cc));
|
153
|
+
for (i = 0; i < childrenTotal; i ++) {
|
154
|
+
gp_result_check(gp_widget_get_child(cc, i, &child));
|
155
|
+
populateWithConfigs(child, hash);
|
156
|
+
}
|
157
|
+
break;
|
195
158
|
}
|
196
159
|
}
|
197
160
|
|
@@ -199,39 +162,27 @@ static void camera_mark(GPhoto2Camera *c) {
|
|
199
162
|
}
|
200
163
|
|
201
164
|
static void camera_free(GPhoto2Camera *c) {
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
retval = gp_camera_free(c->camera);
|
165
|
+
gp_result_check(gp_camera_exit(c->camera, c->context));
|
166
|
+
gp_result_check(gp_widget_free(c->config));
|
167
|
+
gp_result_check(gp_list_free(c->list));
|
168
|
+
gp_result_check(gp_file_free(c->file));
|
169
|
+
gp_result_check(gp_camera_free(c->camera));
|
208
170
|
free(c->virtFolder);
|
209
171
|
free(c->context);
|
210
172
|
free(c);
|
211
173
|
}
|
212
174
|
|
213
175
|
static VALUE camera_allocate(VALUE klass) {
|
214
|
-
int retval;
|
215
176
|
GPhoto2Camera *c;
|
216
177
|
c = (GPhoto2Camera*) malloc(sizeof(GPhoto2Camera));
|
217
178
|
c->virtFolder = (char*) malloc(sizeof(char)*100);
|
218
179
|
strcpy(c->virtFolder, "/");
|
219
180
|
c->context = gp_context_new();
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
if (retval == GP_OK) {
|
226
|
-
retval = gp_file_new(&(c->file));
|
227
|
-
if (retval == GP_OK) {
|
228
|
-
return Data_Wrap_Struct(klass, camera_mark, camera_free, c);
|
229
|
-
}
|
230
|
-
}
|
231
|
-
}
|
232
|
-
}
|
233
|
-
rb_raise_gp_result(retval);
|
234
|
-
return Qnil;
|
181
|
+
gp_result_check(gp_camera_new(&(c->camera)));
|
182
|
+
gp_result_check(gp_list_new(&(c->list)));
|
183
|
+
gp_result_check(gp_camera_get_config(c->camera, &(c->config), c->context));
|
184
|
+
gp_result_check(gp_file_new(&(c->file)));
|
185
|
+
return Data_Wrap_Struct(klass, camera_mark, camera_free, c);
|
235
186
|
}
|
236
187
|
|
237
188
|
/*
|
@@ -250,44 +201,37 @@ static VALUE camera_allocate(VALUE klass) {
|
|
250
201
|
*
|
251
202
|
*/
|
252
203
|
static VALUE camera_initialize(int argc, VALUE *argv, VALUE self) {
|
204
|
+
GPhoto2Camera *c;
|
205
|
+
VALUE cfgs;
|
206
|
+
|
207
|
+
Data_Get_Struct(self, GPhoto2Camera, c);
|
208
|
+
|
253
209
|
switch (argc) {
|
254
210
|
case 0:
|
255
|
-
return self;
|
256
211
|
break;
|
257
212
|
case 1:
|
258
213
|
Check_Type(argv[0], T_STRING);
|
259
|
-
int
|
214
|
+
int portIndex;
|
260
215
|
GPPortInfoList *portInfoList;
|
261
216
|
GPPortInfo p;
|
262
|
-
GPhoto2Camera *c;
|
263
|
-
|
264
|
-
Data_Get_Struct(self, GPhoto2Camera, c);
|
265
217
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
retval = gp_port_info_list_get_info(portInfoList, portIndex, &p);
|
273
|
-
if (retval == GP_OK) {
|
274
|
-
retval = gp_camera_set_port_info(c->camera, p);
|
275
|
-
if (retval == GP_OK) {
|
276
|
-
return self;
|
277
|
-
}
|
278
|
-
}
|
279
|
-
} else {
|
280
|
-
rb_raise_gp_result(portIndex);
|
281
|
-
return Qnil;
|
282
|
-
}
|
283
|
-
}
|
284
|
-
}
|
285
|
-
rb_raise_gp_result(retval);
|
286
|
-
return Qnil;
|
218
|
+
gp_result_check(gp_port_info_list_new(&portInfoList));
|
219
|
+
gp_result_check(gp_port_info_list_load(portInfoList));
|
220
|
+
portIndex = gp_result_check(gp_port_info_list_lookup_path(portInfoList, RSTRING(argv[0])->ptr));
|
221
|
+
gp_result_check(gp_port_info_list_get_info(portInfoList, portIndex, &p));
|
222
|
+
gp_result_check(gp_camera_set_port_info(c->camera, p));
|
223
|
+
break;
|
287
224
|
default:
|
288
225
|
rb_raise(rb_eArgError, "Wrong number of arguments (%d for 0 or 1)", argc);
|
289
226
|
return Qnil;
|
290
227
|
}
|
228
|
+
|
229
|
+
cfgs = rb_hash_new();
|
230
|
+
populateWithConfigs(c->config, cfgs);
|
231
|
+
rb_iv_set(self, "@configuration", cfgs);
|
232
|
+
rb_iv_set(self, "@configs_changed", rb_ary_new());
|
233
|
+
|
234
|
+
return self;
|
291
235
|
}
|
292
236
|
|
293
237
|
/*
|
@@ -306,60 +250,55 @@ static VALUE camera_initialize(int argc, VALUE *argv, VALUE self) {
|
|
306
250
|
*
|
307
251
|
*/
|
308
252
|
static VALUE camera_class_ports(VALUE klass) {
|
309
|
-
int
|
253
|
+
int i, portsTotal;
|
310
254
|
GPPortInfoList *portInfoList;
|
311
255
|
GPPortInfo p;
|
312
256
|
VALUE arr;
|
313
257
|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
if ((retval == GP_OK) && (strlen(p.path) > 4) && (strncmp(p.path, "usb:", 4) == 0)) {
|
323
|
-
rb_ary_push(arr, rb_str_new2(p.path));
|
324
|
-
}
|
325
|
-
}
|
326
|
-
retval = gp_port_info_list_free(portInfoList);
|
327
|
-
if (retval == GP_OK) {
|
328
|
-
return arr;
|
329
|
-
}
|
258
|
+
gp_result_check(gp_port_info_list_new(&portInfoList));
|
259
|
+
gp_result_check(gp_port_info_list_load(portInfoList));
|
260
|
+
portsTotal = gp_result_check(gp_port_info_list_count(portInfoList));
|
261
|
+
arr = rb_ary_new();
|
262
|
+
for(i = 0; i < portsTotal; i++) {
|
263
|
+
gp_result_check(gp_port_info_list_get_info(portInfoList, i, &p));
|
264
|
+
if ((strlen(p.path) > 4) && (strncmp(p.path, "usb:", 4) == 0)) {
|
265
|
+
rb_ary_push(arr, rb_str_new2(p.path));
|
330
266
|
}
|
331
267
|
}
|
332
|
-
|
333
|
-
return
|
268
|
+
gp_result_check(gp_port_info_list_free(portInfoList));
|
269
|
+
return arr;
|
334
270
|
}
|
335
271
|
|
336
272
|
/*
|
337
273
|
* call-seq:
|
338
|
-
* capture
|
274
|
+
* capture(config={}) => camera
|
339
275
|
*
|
340
|
-
* Sends command to camera to capture image with current
|
276
|
+
* Sends command to camera to capture image with current or provided
|
277
|
+
* configuration. Provided configuration is kept after capture.
|
341
278
|
*
|
342
279
|
* Examples:
|
343
280
|
*
|
344
281
|
* c = GPhoto2::Camera.new
|
345
282
|
* c.capture
|
283
|
+
* c.capture "exptime" => "0.010", "iso" => "400"
|
346
284
|
*
|
347
285
|
*/
|
348
|
-
static VALUE camera_capture(VALUE self) {
|
349
|
-
int retval;
|
286
|
+
static VALUE camera_capture(int argc, VALUE *argv, VALUE self) {
|
350
287
|
GPhoto2Camera *c;
|
351
288
|
|
352
289
|
Data_Get_Struct(self, GPhoto2Camera, c);
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
return self;
|
359
|
-
} else {
|
360
|
-
rb_raise_gp_result(retval);
|
290
|
+
|
291
|
+
if (argc == 1) {
|
292
|
+
camera_config_merge(self, argv[0]);
|
293
|
+
} else if (argc != 0) {
|
294
|
+
rb_raise(rb_eArgError, "Wrong number of arguments (%d for 0 or 1)", argc);
|
361
295
|
return Qnil;
|
362
296
|
}
|
297
|
+
|
298
|
+
gp_result_check(gp_camera_capture(c->camera, GP_CAPTURE_IMAGE, &(c->path), c->context));
|
299
|
+
strcpy(c->virtFolder, c->path.folder);
|
300
|
+
// printf("captured: %s/%s\n", c->path.folder, c->path.name);
|
301
|
+
return self;
|
363
302
|
}
|
364
303
|
|
365
304
|
/*
|
@@ -388,7 +327,7 @@ static VALUE camera_capture(VALUE self) {
|
|
388
327
|
*
|
389
328
|
*/
|
390
329
|
static VALUE camera_save(int argc, VALUE *argv, VALUE self) {
|
391
|
-
int
|
330
|
+
int i;
|
392
331
|
int newName = -1;
|
393
332
|
CameraFileType fileType = GP_FILE_TYPE_NORMAL;
|
394
333
|
GPhoto2Camera *c;
|
@@ -467,33 +406,25 @@ static VALUE camera_save(int argc, VALUE *argv, VALUE self) {
|
|
467
406
|
return Qnil;
|
468
407
|
}
|
469
408
|
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
strcat(fName, pchSrc);
|
482
|
-
} else if (strcmp(pchNew, pchSrc) != 0) {
|
483
|
-
strcat(fName, pchSrc);
|
484
|
-
}
|
485
|
-
} else {
|
486
|
-
strcat(fName, cFileName);
|
487
|
-
}
|
488
|
-
fd = open(fName, O_CREAT | O_WRONLY, 0644);
|
489
|
-
write(fd, fData, fSize);
|
490
|
-
close(fd);
|
491
|
-
return self;
|
492
|
-
}
|
409
|
+
gp_result_check(gp_filesystem_reset(c->camera->fs));
|
410
|
+
gp_result_check(gp_camera_file_get(c->camera, cFolderName, cFileName, fileType, c->file, c->context));
|
411
|
+
gp_result_check(gp_file_get_data_and_size(c->file, &fData, &fSize));
|
412
|
+
if (newName == 0) {
|
413
|
+
strcat(fName, newNameStr);
|
414
|
+
pchNew = strrchr(newNameStr, '.');
|
415
|
+
pchSrc = strrchr(cFileName, '.');
|
416
|
+
if (pchNew == NULL) {
|
417
|
+
strcat(fName, pchSrc);
|
418
|
+
} else if (strcmp(pchNew, pchSrc) != 0) {
|
419
|
+
strcat(fName, pchSrc);
|
493
420
|
}
|
421
|
+
} else {
|
422
|
+
strcat(fName, cFileName);
|
494
423
|
}
|
495
|
-
|
496
|
-
|
424
|
+
fd = open(fName, O_CREAT | O_WRONLY, 0644);
|
425
|
+
write(fd, fData, fSize);
|
426
|
+
close(fd);
|
427
|
+
return self;
|
497
428
|
}
|
498
429
|
|
499
430
|
/*
|
@@ -514,7 +445,7 @@ static VALUE camera_save(int argc, VALUE *argv, VALUE self) {
|
|
514
445
|
*
|
515
446
|
*/
|
516
447
|
static VALUE camera_delete(int argc, VALUE *argv, VALUE self) {
|
517
|
-
int
|
448
|
+
int i;
|
518
449
|
GPhoto2Camera *c;
|
519
450
|
const char *key;
|
520
451
|
char cFileName[100], cFolderName[100];
|
@@ -554,28 +485,22 @@ static VALUE camera_delete(int argc, VALUE *argv, VALUE self) {
|
|
554
485
|
return Qnil;
|
555
486
|
}
|
556
487
|
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
if (retval == GP_OK) {
|
561
|
-
return self;
|
562
|
-
}
|
563
|
-
}
|
564
|
-
rb_raise_gp_result(retval);
|
565
|
-
return Qnil;
|
488
|
+
gp_result_check(gp_filesystem_reset(c->camera->fs));
|
489
|
+
gp_result_check(gp_camera_file_delete(c->camera, cFolderName, cFileName, c->context));
|
490
|
+
return self;
|
566
491
|
}
|
567
492
|
|
568
493
|
/*
|
569
494
|
* call-seq:
|
570
|
-
*
|
495
|
+
* config => hash
|
571
496
|
*
|
572
|
-
* Returns
|
497
|
+
* Returns cached hash of adjustable camera configuration with their values.
|
573
498
|
*
|
574
499
|
* Examples:
|
575
500
|
*
|
576
501
|
* c = GPhoto2::Camera.new
|
577
502
|
* # with Nikon DSC D80
|
578
|
-
* c.
|
503
|
+
* c.config.keys #=> ["capturetarget", "imgquality",
|
579
504
|
* "imgsize", "whitebalance",
|
580
505
|
* "f-number", "focallength",
|
581
506
|
* "focusmode", "iso",
|
@@ -587,25 +512,82 @@ static VALUE camera_delete(int argc, VALUE *argv, VALUE self) {
|
|
587
512
|
* "channel", "encryption"]
|
588
513
|
*
|
589
514
|
*/
|
590
|
-
static VALUE
|
515
|
+
static VALUE camera_get_config(VALUE self) {
|
516
|
+
return rb_iv_get(self, "@configuration");
|
517
|
+
}
|
518
|
+
|
519
|
+
/*
|
520
|
+
* call-seq:
|
521
|
+
* config_merge(hash) => hash
|
522
|
+
*
|
523
|
+
* Adjusts camera configuration with given values.
|
524
|
+
*
|
525
|
+
* Examples:
|
526
|
+
*
|
527
|
+
* c = GPhoto2::Camera.new
|
528
|
+
* # with Nikon DSC D80
|
529
|
+
* c.config_merge "f-number" => "f/4", "exptime" => "0.010", "iso" => "200"
|
530
|
+
*
|
531
|
+
*/
|
532
|
+
static VALUE camera_config_merge(VALUE self, VALUE hash) {
|
533
|
+
Check_Type(hash, T_HASH);
|
534
|
+
|
535
|
+
int i;
|
536
|
+
const char *key;
|
591
537
|
GPhoto2Camera *c;
|
592
|
-
|
538
|
+
CameraWidgetType widgettype;
|
539
|
+
VALUE arr, cfgs, cfg_changed;
|
593
540
|
|
594
541
|
Data_Get_Struct(self, GPhoto2Camera, c);
|
595
542
|
|
596
|
-
|
597
|
-
|
598
|
-
|
543
|
+
arr = rb_funcall(hash, rb_intern("keys"), 0);
|
544
|
+
cfgs = rb_iv_get(self, "@configuration");
|
545
|
+
cfg_changed = rb_iv_get(self, "@configs_changed");
|
546
|
+
for (i = 0; i < RARRAY(arr)->len; i++) {
|
547
|
+
switch(TYPE(RARRAY(arr)->ptr[i])) {
|
548
|
+
case T_STRING:
|
549
|
+
key = RSTRING(RARRAY(arr)->ptr[i])->ptr;
|
550
|
+
break;
|
551
|
+
case T_SYMBOL:
|
552
|
+
key = rb_id2name(rb_to_id(RARRAY(arr)->ptr[i]));
|
553
|
+
break;
|
554
|
+
default:
|
555
|
+
rb_raise(rb_eTypeError, "Not valid key type");
|
556
|
+
return Qnil;
|
557
|
+
}
|
558
|
+
if (TYPE(rb_funcall(cfgs, rb_intern("has_key?"), 1, rb_str_new2(key))) == T_TRUE) {
|
559
|
+
gp_result_check(gp_widget_get_child_by_name(c->config, key, &(c->childConfig)));
|
560
|
+
gp_result_check(gp_widget_get_type(c->childConfig, &widgettype));
|
561
|
+
switch (widgettype) {
|
562
|
+
case GP_WIDGET_RADIO:
|
563
|
+
rb_ary_push(cfg_changed, rb_str_new2(key));
|
564
|
+
setRadio(self, c, rb_hash_aref(hash, RARRAY(arr)->ptr[i]), 0);
|
565
|
+
break;
|
566
|
+
case GP_WIDGET_RANGE:
|
567
|
+
rb_ary_push(cfg_changed, rb_str_new2(key));
|
568
|
+
setRange(self, c, rb_hash_aref(hash, RARRAY(arr)->ptr[i]), 0);
|
569
|
+
break;
|
570
|
+
}
|
571
|
+
}
|
572
|
+
}
|
573
|
+
saveConfigs(self, c);
|
574
|
+
return cfgs;
|
599
575
|
}
|
600
576
|
|
601
577
|
/*
|
602
578
|
* call-seq:
|
603
579
|
* cam[cfg] => float or string
|
604
580
|
* cam[cfg, :all] => array
|
581
|
+
* cam[cfg, :type] => fixnum
|
605
582
|
*
|
606
583
|
* Returns current value of specified camera configuration. Configuration name
|
607
584
|
* (cfg) can be string or symbol and must be in configs method returned array.
|
608
|
-
*
|
585
|
+
* Configuration is cached in @configuration instance variable.
|
586
|
+
*
|
587
|
+
* Possible directives:
|
588
|
+
* * <b>:no_cache</b> doesn't use cached configuration value
|
589
|
+
* * <b>:all</b> returns an array of allowed values;
|
590
|
+
* * <b>:type</b> returns one of available CONFIG_TYPE constats
|
609
591
|
*
|
610
592
|
* Examples:
|
611
593
|
*
|
@@ -614,14 +596,15 @@ static VALUE camera_get_configs(VALUE self) {
|
|
614
596
|
* c["f-number"] #=> "f/4.5"
|
615
597
|
* c[:focallength] #=> 10.5
|
616
598
|
* c[:focusmode, :all] #=> ["Manual", "AF-S", "AF-C", "AF-A"]
|
599
|
+
* c[:exptime, :type] == GPhoto2::Camera::CONFIG_TYPE_RADIO
|
600
|
+
* #=> true
|
617
601
|
*
|
618
602
|
*/
|
619
603
|
static VALUE camera_get_value(int argc, VALUE *argv, VALUE self) {
|
620
|
-
int retval;
|
621
604
|
const char *name;
|
622
605
|
GPhoto2Camera *c;
|
623
606
|
CameraWidgetType widgettype;
|
624
|
-
VALUE str, dir;
|
607
|
+
VALUE str, dir, cfgs;
|
625
608
|
|
626
609
|
switch (argc) {
|
627
610
|
case 1:
|
@@ -630,6 +613,7 @@ static VALUE camera_get_value(int argc, VALUE *argv, VALUE self) {
|
|
630
613
|
case 2:
|
631
614
|
str = argv[0];
|
632
615
|
dir = argv[1];
|
616
|
+
Check_Type(dir, T_SYMBOL);
|
633
617
|
break;
|
634
618
|
default:
|
635
619
|
rb_raise(rb_eArgError, "Wrong number of arguments (%d for 1 or 2)", argc);
|
@@ -648,45 +632,43 @@ static VALUE camera_get_value(int argc, VALUE *argv, VALUE self) {
|
|
648
632
|
return Qnil;
|
649
633
|
}
|
650
634
|
|
651
|
-
|
635
|
+
if (argc == 1) {
|
636
|
+
return rb_hash_aref(rb_iv_get(self, "@configuration"), rb_str_new2(name));
|
637
|
+
} else {
|
638
|
+
Data_Get_Struct(self, GPhoto2Camera, c);
|
652
639
|
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
return Qnil;
|
666
|
-
}
|
667
|
-
break;
|
668
|
-
case GP_WIDGET_RANGE:
|
669
|
-
if (argc == 1) {
|
670
|
-
return getRange(c->childConfig);
|
671
|
-
} else if (strcmp(rb_id2name(rb_to_id(dir)), "all") == 0) {
|
672
|
-
return listRange(c->childConfig);
|
673
|
-
} else {
|
674
|
-
rb_raise(rb_cGPhoto2ConfigurationError, "Second parameter not valid");
|
675
|
-
return Qnil;
|
676
|
-
}
|
677
|
-
break;
|
678
|
-
default:
|
679
|
-
rb_raise(rb_cGPhoto2ConfigurationError, "Not supported yet");
|
640
|
+
gp_result_check(gp_widget_get_child_by_name(c->config, name, &(c->childConfig)));
|
641
|
+
gp_result_check(gp_widget_get_type(c->childConfig, &widgettype));
|
642
|
+
switch (widgettype) {
|
643
|
+
case GP_WIDGET_RADIO:
|
644
|
+
if (strcmp(rb_id2name(rb_to_id(dir)), "no_cache") == 0) {
|
645
|
+
return getRadio(c->childConfig);
|
646
|
+
} else if (strcmp(rb_id2name(rb_to_id(dir)), "all") == 0) {
|
647
|
+
return listRadio(c->childConfig);
|
648
|
+
} else if (strcmp(rb_id2name(rb_to_id(dir)), "type") == 0) {
|
649
|
+
return INT2FIX(GP_WIDGET_RADIO);
|
650
|
+
} else {
|
651
|
+
rb_raise(rb_cGPhoto2ConfigurationError, "Unknown directive '%s'", rb_id2name(rb_to_id(dir)));
|
680
652
|
return Qnil;
|
681
|
-
|
653
|
+
}
|
654
|
+
break;
|
655
|
+
case GP_WIDGET_RANGE:
|
656
|
+
if (strcmp(rb_id2name(rb_to_id(dir)), "no_cache") == 0) {
|
657
|
+
return getRange(c->childConfig);
|
658
|
+
} else if (strcmp(rb_id2name(rb_to_id(dir)), "all") == 0) {
|
659
|
+
return listRange(c->childConfig);
|
660
|
+
} else if (strcmp(rb_id2name(rb_to_id(dir)), "type") == 0) {
|
661
|
+
return INT2FIX(GP_WIDGET_RANGE);
|
662
|
+
} else {
|
663
|
+
rb_raise(rb_cGPhoto2ConfigurationError, "Unknown directive '%s'", rb_id2name(rb_to_id(dir)));
|
664
|
+
return Qnil;
|
665
|
+
}
|
666
|
+
break;
|
667
|
+
default:
|
668
|
+
rb_raise(rb_cGPhoto2ConfigurationError, "Not supported yet");
|
669
|
+
return Qnil;
|
682
670
|
}
|
683
671
|
}
|
684
|
-
if (retval != GP_OK) {
|
685
|
-
rb_raise_gp_result(retval);
|
686
|
-
} else {
|
687
|
-
rb_raise_programmer_error("camera_get_value");
|
688
|
-
}
|
689
|
-
return Qnil;
|
690
672
|
}
|
691
673
|
|
692
674
|
/*
|
@@ -704,10 +686,10 @@ static VALUE camera_get_value(int argc, VALUE *argv, VALUE self) {
|
|
704
686
|
*
|
705
687
|
*/
|
706
688
|
static VALUE camera_set_value(VALUE self, VALUE str, VALUE newVal) {
|
707
|
-
int retval;
|
708
689
|
const char *name;
|
709
690
|
GPhoto2Camera *c;
|
710
691
|
CameraWidgetType widgettype;
|
692
|
+
VALUE cfg_changed;
|
711
693
|
|
712
694
|
switch (TYPE(str)) {
|
713
695
|
case T_STRING:
|
@@ -723,29 +705,23 @@ static VALUE camera_set_value(VALUE self, VALUE str, VALUE newVal) {
|
|
723
705
|
|
724
706
|
Data_Get_Struct(self, GPhoto2Camera, c);
|
725
707
|
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
}
|
743
|
-
if (retval != GP_OK) {
|
744
|
-
rb_raise_gp_result(retval);
|
745
|
-
} else {
|
746
|
-
rb_raise_programmer_error("camera_set_value");
|
708
|
+
gp_result_check(gp_widget_get_child_by_name(c->config, name, &(c->childConfig)));
|
709
|
+
gp_result_check(gp_widget_get_type(c->childConfig, &widgettype));
|
710
|
+
switch (widgettype) {
|
711
|
+
case GP_WIDGET_RADIO:
|
712
|
+
cfg_changed = rb_iv_get(self, "@configs_changed");
|
713
|
+
rb_ary_push(cfg_changed, rb_str_new2(name));
|
714
|
+
return setRadio(self, c, newVal, 1);
|
715
|
+
break;
|
716
|
+
case GP_WIDGET_RANGE:
|
717
|
+
cfg_changed = rb_iv_get(self, "@configs_changed");
|
718
|
+
rb_ary_push(cfg_changed, rb_str_new2(name));
|
719
|
+
return setRange(self, c, newVal, 1);
|
720
|
+
break;
|
721
|
+
default:
|
722
|
+
rb_raise(rb_cGPhoto2ConfigurationError, "Cannot access this setting");
|
723
|
+
return Qnil;
|
747
724
|
}
|
748
|
-
return Qnil;
|
749
725
|
}
|
750
726
|
|
751
727
|
/*
|
@@ -787,31 +763,21 @@ static VALUE camera_folder(VALUE self) {
|
|
787
763
|
*
|
788
764
|
*/
|
789
765
|
static VALUE camera_subfolders(VALUE self) {
|
790
|
-
int
|
766
|
+
int i, count;
|
791
767
|
const char *name;
|
792
768
|
GPhoto2Camera *c;
|
793
769
|
VALUE arr;
|
794
770
|
|
795
771
|
Data_Get_Struct(self, GPhoto2Camera, c);
|
796
772
|
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
}
|
804
|
-
arr = rb_ary_new();
|
805
|
-
for (i = 0; i < count; i++) {
|
806
|
-
retval = gp_list_get_name(c->list, i, &name);
|
807
|
-
if (retval == GP_OK) {
|
808
|
-
rb_ary_push(arr, rb_str_new2(name));
|
809
|
-
}
|
810
|
-
}
|
811
|
-
return arr;
|
773
|
+
gp_result_check(gp_camera_folder_list_folders(c->camera, c->virtFolder, c->list, c->context));
|
774
|
+
count = gp_result_check(gp_list_count(c->list));
|
775
|
+
arr = rb_ary_new();
|
776
|
+
for (i = 0; i < count; i++) {
|
777
|
+
gp_result_check(gp_list_get_name(c->list, i, &name));
|
778
|
+
rb_ary_push(arr, rb_str_new2(name));
|
812
779
|
}
|
813
|
-
|
814
|
-
return Qnil;
|
780
|
+
return arr;
|
815
781
|
}
|
816
782
|
|
817
783
|
/*
|
@@ -832,34 +798,22 @@ static VALUE camera_subfolders(VALUE self) {
|
|
832
798
|
*
|
833
799
|
*/
|
834
800
|
static VALUE camera_files(VALUE self) {
|
835
|
-
int
|
801
|
+
int i, count;
|
836
802
|
const char *name;
|
837
803
|
GPhoto2Camera *c;
|
838
804
|
VALUE arr;
|
839
805
|
|
840
806
|
Data_Get_Struct(self, GPhoto2Camera, c);
|
841
807
|
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
return Qnil;
|
850
|
-
}
|
851
|
-
arr = rb_ary_new();
|
852
|
-
for (i = 0; i < count; i++) {
|
853
|
-
retval = gp_list_get_name(c->list, i, &name);
|
854
|
-
if (retval == GP_OK) {
|
855
|
-
rb_ary_push(arr, rb_str_new2(name));
|
856
|
-
}
|
857
|
-
}
|
858
|
-
return arr;
|
859
|
-
}
|
808
|
+
gp_result_check(gp_filesystem_reset(c->camera->fs));
|
809
|
+
gp_result_check(gp_camera_folder_list_files(c->camera, c->virtFolder, c->list, c->context));
|
810
|
+
count = gp_result_check(gp_list_count(c->list));
|
811
|
+
arr = rb_ary_new();
|
812
|
+
for (i = 0; i < count; i++) {
|
813
|
+
gp_result_check(gp_list_get_name(c->list, i, &name));
|
814
|
+
rb_ary_push(arr, rb_str_new2(name));
|
860
815
|
}
|
861
|
-
|
862
|
-
return Qnil;
|
816
|
+
return arr;
|
863
817
|
}
|
864
818
|
|
865
819
|
/*
|
@@ -916,7 +870,7 @@ static VALUE camera_folder_up(VALUE self) {
|
|
916
870
|
*/
|
917
871
|
static VALUE camera_folder_down(VALUE self, VALUE folder) {
|
918
872
|
Check_Type(folder, T_STRING);
|
919
|
-
|
873
|
+
|
920
874
|
const char *name;
|
921
875
|
int index;
|
922
876
|
GPhoto2Camera *c;
|
@@ -924,16 +878,12 @@ static VALUE camera_folder_down(VALUE self, VALUE folder) {
|
|
924
878
|
Data_Get_Struct(self, GPhoto2Camera, c);
|
925
879
|
|
926
880
|
name = RSTRING(folder)->ptr;
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
if (strlen(c->virtFolder) > 1) {
|
932
|
-
strcat(c->virtFolder, "/");
|
933
|
-
}
|
934
|
-
strcat(c->virtFolder, name);
|
935
|
-
}
|
881
|
+
gp_result_check(gp_camera_folder_list_folders(c->camera, c->virtFolder, c->list, c->context));
|
882
|
+
gp_result_check(gp_list_find_by_name(c->list, &index, name));
|
883
|
+
if (strlen(c->virtFolder) > 1) {
|
884
|
+
strcat(c->virtFolder, "/");
|
936
885
|
}
|
886
|
+
strcat(c->virtFolder, name);
|
937
887
|
return self;
|
938
888
|
}
|
939
889
|
|
@@ -957,18 +907,18 @@ void Init_gphoto4ruby() {
|
|
957
907
|
* supported
|
958
908
|
*/
|
959
909
|
rb_cGPhoto2ConfigurationError = rb_define_class_under(rb_mGPhoto2, "ConfigurationError", rb_eStandardError);
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
rb_cGPhoto2ProgrammerError = rb_define_class_under(rb_mGPhoto2, "ProgrammerError", rb_eStandardError);
|
910
|
+
|
911
|
+
rb_define_const(rb_cGPhoto2Camera, "CONFIG_TYPE_RADIO", INT2FIX(GP_WIDGET_RADIO));
|
912
|
+
rb_define_const(rb_cGPhoto2Camera, "CONFIG_TYPE_RANGE", INT2FIX(GP_WIDGET_RANGE));
|
913
|
+
|
965
914
|
rb_define_alloc_func(rb_cGPhoto2Camera, camera_allocate);
|
966
915
|
rb_define_module_function(rb_cGPhoto2Camera, "ports", camera_class_ports, 0);
|
967
916
|
rb_define_method(rb_cGPhoto2Camera, "initialize", camera_initialize, -1);
|
968
|
-
rb_define_method(rb_cGPhoto2Camera, "
|
917
|
+
rb_define_method(rb_cGPhoto2Camera, "config", camera_get_config, 0);
|
918
|
+
rb_define_method(rb_cGPhoto2Camera, "config_merge", camera_config_merge, 1);
|
969
919
|
rb_define_method(rb_cGPhoto2Camera, "[]", camera_get_value, -1);
|
970
920
|
rb_define_method(rb_cGPhoto2Camera, "[]=", camera_set_value, 2);
|
971
|
-
rb_define_method(rb_cGPhoto2Camera, "capture", camera_capture,
|
921
|
+
rb_define_method(rb_cGPhoto2Camera, "capture", camera_capture, -1);
|
972
922
|
rb_define_method(rb_cGPhoto2Camera, "save", camera_save, -1);
|
973
923
|
rb_define_method(rb_cGPhoto2Camera, "delete", camera_delete, -1);
|
974
924
|
rb_define_method(rb_cGPhoto2Camera, "folder", camera_folder, 0);
|
data/ext/gphoto4ruby.h
CHANGED
@@ -36,17 +36,17 @@ static VALUE rb_mGPhoto2;
|
|
36
36
|
static VALUE rb_cGPhoto2Camera;
|
37
37
|
static VALUE rb_cGPhoto2Exception;
|
38
38
|
static VALUE rb_cGPhoto2ConfigurationError;
|
39
|
-
static VALUE rb_cGPhoto2ProgrammerError;
|
40
39
|
|
41
40
|
static void rb_raise_gp_result(int retval);
|
42
41
|
static void rb_raise_programmer_error(const char* fName);
|
43
42
|
|
44
43
|
static VALUE getRadio(CameraWidget *cc);
|
45
44
|
static VALUE listRadio(CameraWidget *cc);
|
46
|
-
static VALUE setRadio(GPhoto2Camera *c, VALUE newVal);
|
45
|
+
static VALUE setRadio(VALUE self, GPhoto2Camera *c, VALUE newVal, int save);
|
47
46
|
static VALUE getRange(CameraWidget *cc);
|
48
47
|
static VALUE listRange(CameraWidget *cc);
|
49
|
-
static VALUE setRange(GPhoto2Camera *c, VALUE newNum);
|
48
|
+
static VALUE setRange(VALUE self, GPhoto2Camera *c, VALUE newNum, int save);
|
49
|
+
static void saveConfigs(VALUE self, GPhoto2Camera *c);
|
50
50
|
|
51
51
|
static void populateWithConfigs(CameraWidget *cc, VALUE arr);
|
52
52
|
|
@@ -57,11 +57,13 @@ static VALUE camera_allocate(VALUE klass);
|
|
57
57
|
static VALUE camera_initialize(int argc, VALUE *argv, VALUE self);
|
58
58
|
static VALUE camera_class_ports(VALUE klass);
|
59
59
|
|
60
|
-
static VALUE camera_capture(VALUE self);
|
60
|
+
static VALUE camera_capture(int argc, VALUE *argv, VALUE self);
|
61
61
|
|
62
62
|
static VALUE camera_save(int argc, VALUE *argv, VALUE self);
|
63
63
|
|
64
|
-
static VALUE
|
64
|
+
static VALUE camera_get_config(VALUE self);
|
65
|
+
static VALUE camera_config_merge(VALUE self, VALUE hash);
|
66
|
+
|
65
67
|
static VALUE camera_get_value(int argc, VALUE *argv, VALUE self);
|
66
68
|
static VALUE camera_set_value(VALUE self, VALUE str, VALUE newVal);
|
67
69
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gphoto4ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- heq4 company
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2008-08-
|
13
|
+
date: 2008-08-26 00:00:00 +04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|