* examples * gphoto2 * libgphoto2 * libgphoto2_port The code (at least in this part of the project) is effectively formated using tabs with a tab-size of 8 as a means for indentation. There have been a few places where spaces were introduced. Some obviously with an indent size of 8 in mind, others with an indent size of 4. This commit tries its best to make the use of tabs consistent again, at least for indenting lines. The "intra line" indentation (white space after the first non-white-space character) is still a bit of a mess. Co-authored-by: axxel <awagger@web.de>
202 lines
5.7 KiB
C
202 lines
5.7 KiB
C
/* compile with gcc -Wall -o canon-capture -lgphoto2 canon-capture.c
|
|
* This code released into the public domain 21 July 2008
|
|
*
|
|
* This program does the equivalent of:
|
|
* gphoto2 --shell
|
|
* > set-config capture=1
|
|
* > capture-image-and-download
|
|
* compile with gcc -Wall -o canon-capture -lgphoto2 canon-capture.c
|
|
*
|
|
* Taken from: http://credentiality2.blogspot.com/2008/07/linux-libgphoto2-image-capture-from.html
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <gphoto2/gphoto2.h>
|
|
|
|
#include "samples.h"
|
|
|
|
static void errordumper(GPLogLevel level, const char *domain, const char *str, void *data)
|
|
{
|
|
printf("%s (data %p)\n", str,data);
|
|
}
|
|
|
|
/* This seems to have no effect on where images go
|
|
void set_capturetarget(Camera *canon, GPContext *canoncontext) {
|
|
int retval;
|
|
printf("Get root config.\n");
|
|
CameraWidget *rootconfig; // okay, not really
|
|
CameraWidget *actualrootconfig;
|
|
|
|
retval = gp_camera_get_config(canon, &rootconfig, canoncontext);
|
|
actualrootconfig = rootconfig;
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Get main config.\n");
|
|
CameraWidget *child;
|
|
retval = gp_widget_get_child_by_name(rootconfig, "main", &child);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Get settings config.\n");
|
|
rootconfig = child;
|
|
retval = gp_widget_get_child_by_name(rootconfig, "settings", &child);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Get capturetarget.\n");
|
|
rootconfig = child;
|
|
retval = gp_widget_get_child_by_name(rootconfig, "capturetarget", &child);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
|
|
CameraWidget *capture = child;
|
|
|
|
const char *widgetinfo;
|
|
gp_widget_get_name(capture, &widgetinfo);
|
|
printf("config name: %s\n", widgetinfo );
|
|
|
|
const char *widgetlabel;
|
|
gp_widget_get_label(capture, &widgetlabel);
|
|
printf("config label: %s\n", widgetlabel);
|
|
|
|
int widgetid;
|
|
gp_widget_get_id(capture, &widgetid);
|
|
printf("config id: %d\n", widgetid);
|
|
|
|
CameraWidgetType widgettype;
|
|
gp_widget_get_type(capture, &widgettype);
|
|
printf("config type: %d == %d \n", widgettype, GP_WIDGET_RADIO);
|
|
|
|
|
|
printf("Set value.\n");
|
|
|
|
// capture to ram should be 0, although I think the filename also plays into
|
|
// it
|
|
int one=1;
|
|
retval = gp_widget_set_value(capture, &one);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Enabling capture to CF.\n");
|
|
retval = gp_camera_set_config(canon, actualrootconfig, canoncontext);
|
|
printf(" Retval: %d\n", retval);
|
|
}
|
|
*/
|
|
|
|
#if 0
|
|
static void
|
|
capture_to_file(Camera *canon, GPContext *canoncontext, char *fn) {
|
|
int fd, retval;
|
|
CameraFile *canonfile;
|
|
CameraFilePath camera_file_path;
|
|
|
|
printf("Capturing.\n");
|
|
|
|
retval = gp_camera_capture(canon, GP_CAPTURE_IMAGE, &camera_file_path, canoncontext);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Pathname on the camera: %s/%s\n", camera_file_path.folder, camera_file_path.name);
|
|
|
|
fd = open(fn, O_CREAT | O_WRONLY | O_BINARY, 0644);
|
|
retval = gp_file_new_from_fd(&canonfile, fd);
|
|
printf(" Retval: %d\n", retval);
|
|
retval = gp_camera_file_get(canon, camera_file_path.folder, camera_file_path.name,
|
|
GP_FILE_TYPE_NORMAL, canonfile, canoncontext);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Deleting.\n");
|
|
retval = gp_camera_file_delete(canon, camera_file_path.folder, camera_file_path.name,
|
|
canoncontext);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
gp_file_free(canonfile);
|
|
}
|
|
#endif
|
|
|
|
int
|
|
main(int argc, char **argv) {
|
|
Camera *canon;
|
|
int i, retval;
|
|
GPContext *canoncontext = sample_create_context();
|
|
|
|
gp_log_add_func(GP_LOG_ERROR, errordumper, 0);
|
|
gp_camera_new(&canon);
|
|
|
|
/* When I set GP_LOG_DEBUG instead of GP_LOG_ERROR above, I noticed that the
|
|
* init function seems to traverse the entire filesystem on the camera. This
|
|
* is partly why it takes so long.
|
|
* (Marcus: the ptp2 driver does this by default currently.)
|
|
*/
|
|
printf("Camera init. Takes about 10 seconds.\n");
|
|
retval = gp_camera_init(canon, canoncontext);
|
|
if (retval != GP_OK) {
|
|
printf(" Retval: %d\n", retval);
|
|
exit (1);
|
|
}
|
|
canon_enable_capture(canon, TRUE, canoncontext);
|
|
retval = camera_eosviewfinder(canon,canoncontext,1);
|
|
if (retval != GP_OK) {
|
|
fprintf(stderr,"camera_eosviewfinder(1): %d\n", retval);
|
|
exit(1);
|
|
}
|
|
/*set_capturetarget(canon, canoncontext);*/
|
|
printf("Taking 100 previews and saving them to snapshot-XXX.jpg ...\n");
|
|
for (i=0;i<100;i++) {
|
|
CameraFile *file;
|
|
char output_file[32];
|
|
|
|
fprintf(stderr,"preview %d\n", i);
|
|
retval = gp_file_new(&file);
|
|
if (retval != GP_OK) {
|
|
fprintf(stderr,"gp_file_new: %d\n", retval);
|
|
exit(1);
|
|
}
|
|
|
|
/* autofocus every 10 shots */
|
|
if (i%10 == 9) {
|
|
camera_auto_focus (canon, canoncontext, 1);
|
|
/* FIXME: wait a bit and/or poll events ? */
|
|
camera_auto_focus (canon, canoncontext, 0);
|
|
} else {
|
|
camera_manual_focus (canon, (i/10-5)/2, canoncontext);
|
|
}
|
|
#if 0 /* testcase for EOS zooming */
|
|
{
|
|
char buf[20];
|
|
if (i<10) set_config_value_string (canon, "eoszoom", "5", canoncontext);
|
|
sprintf(buf,"%d,%d",(i&0x1f)*64,(i>>5)*64);
|
|
fprintf(stderr, "%d - %s\n", i, buf);
|
|
set_config_value_string (canon, "eoszoomposition", buf, canoncontext);
|
|
}
|
|
#endif
|
|
retval = gp_camera_capture_preview(canon, file, canoncontext);
|
|
if (retval != GP_OK) {
|
|
fprintf(stderr,"gp_camera_capture_preview(%d): %d\n", i, retval);
|
|
exit(1);
|
|
}
|
|
sprintf(output_file, "snapshot-%03d.jpg", i);
|
|
retval = gp_file_save(file, output_file);
|
|
if (retval != GP_OK) {
|
|
fprintf(stderr,"gp_camera_capture_preview(%d): %d\n", i, retval);
|
|
exit(1);
|
|
}
|
|
gp_file_unref(file);
|
|
/*
|
|
sprintf(output_file, "image-%03d.jpg", i);
|
|
capture_to_file(canon, canoncontext, output_file);
|
|
*/
|
|
}
|
|
retval = camera_eosviewfinder(canon,canoncontext,0);
|
|
if (retval != GP_OK) {
|
|
fprintf(stderr,"camera_eosviewfinder(0): %d\n", retval);
|
|
exit(1);
|
|
}
|
|
|
|
sleep(10);
|
|
gp_camera_exit(canon, canoncontext);
|
|
return 0;
|
|
}
|