Files
libgphoto2/examples/preview.c
axxel 5c9d7b2759 fix white-space and indentation inconsistencies in ... (#1002)
* 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>
2024-09-05 09:25:57 +02:00

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;
}