tahoma2d/thirdparty/libgphoto2/include/gphoto2/gphoto2-camera.h
2022-12-20 00:19:55 -05:00

485 lines
17 KiB
C

/** \file
*
* \brief Implement Camera object representing a camera attached to the system.
*
* \author Copyright 2000 Scott Fritzinger
*
* \note
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* \note
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* \note
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
#ifndef LIBGPHOTO2_GPHOTO2_CAMERA_H
#define LIBGPHOTO2_GPHOTO2_CAMERA_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* \brief Object representing a camera attached to the system.
*
* A Camera object represents a specific instance of a (physical of
* virtual) camera attached to the system.
*
* The abilities of this type of camera are stored in a CameraAbility
* object.
*
* The details of the Camera object are internal.
*/
typedef struct _Camera Camera;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#include <gphoto2/gphoto2-abilities-list.h>
#include <gphoto2/gphoto2-port.h>
#include <gphoto2/gphoto2-widget.h>
#include <gphoto2/gphoto2-filesys.h>
#include <gphoto2/gphoto2-result.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* \brief CameraText structure used in various functions.
*
* A text structure containing translated text returned
* by various functions (about, manual, summary). You should
* not assume a size.
*/
typedef struct {
char text [32 * 1024]; /**< \brief Character string containing the translated text. */
} CameraText;
/**
* \brief A structure created by the capture operation.
*
* A structure containing the folder and filename of an object
* after a successful capture and is passed as reference to the
* gp_camera_capture() function.
*/
typedef struct {
char name [128]; /**< \brief Name of the captured file. */
char folder [1024]; /**< \brief Name of the folder of the captured file. */
} CameraFilePath;
/**
* \brief Type of the capture to do.
*
* Specifies the type of capture the user wants to do with the
* gp_camera_capture() function.
*/
typedef enum {
GP_CAPTURE_IMAGE, /**< \brief Capture an image. */
GP_CAPTURE_MOVIE, /**< \brief Capture a movie. */
GP_CAPTURE_SOUND /**< \brief Capture audio. */
} CameraCaptureType;
/**
* \brief Specify what event we received from the camera.
*
* Used by gp_camera_wait_for_event() to specify what
* event happened on the camera.
*
*/
typedef enum {
GP_EVENT_UNKNOWN, /**< unknown and unhandled event. argument is a char* or NULL */
GP_EVENT_TIMEOUT, /**< timeout, no arguments */
GP_EVENT_FILE_ADDED, /**< CameraFilePath* = file path on camfs */
GP_EVENT_FOLDER_ADDED, /**< CameraFilePath* = folder on camfs */
GP_EVENT_CAPTURE_COMPLETE, /**< last capture is complete */
GP_EVENT_FILE_CHANGED /**< CameraFilePath* = file path on camfs */
} CameraEventType;
/**
* \name Camera object member functions
*
* These functions must be implemented by a camlib and the camlib's
* camera_init() function will add them to a Camera object.
*
* @{
*/
/**
* \brief The camera exit function
*
* \param camera the current camera
* \param context a #GPContext
*
* This functions is called in the camera driver for closing the camera
* connection. It should do the necessary cleanups of the internal camera
* state, free allocated private structures and similar.
*
* The driver does not need to close the #GPPort, this is done by libgphoto2
* itself.
*
* Implement this function if you need to any of this stuff, otherwise leave
* it out.
*
* \returns a gphoto error code
*/
typedef int (*CameraExitFunc) (Camera *camera, GPContext *context);
/**
* \brief Get a configuration tree for the camera and its driver
*
* \param camera the current camera
* \param widget pointer to store the toplevel widget of the tree
* \param context the active #GPContext
*
* A camera driver can support configuration of either its own behaviour
* or the camera device itself. To allow a flexible driver framework,
* the camera driver provides a generic configuration widget tree to the
* frontend, which then renders it, allows user input and sends it back
* via the #CameraSetConfigFunc function to have the driver configure itself
* or the camera.
*
* If you do not have configuration ability, there is no need to specify this
* function.
*
* \returns a gphoto error code
*/
typedef int (*CameraGetConfigFunc) (Camera *camera, CameraWidget **widget,
GPContext *context);
/**
* \brief Get a configuration widget for a specific configuration
*
* \param camera the current camera
* \param name the name of the widget
* \param widget pointer to store the toplevel widget of the tree
* \param context the active #GPContext
*
* A camera driver can support configuration of either its own behaviour
* or the camera device itself. To allow a flexible driver framework,
* the camera driver provides a generic configuration widget tree to the
* frontend, which then renders it, allows user input and sends it back
* via the #CameraSetConfigFunc function to have the driver configure itself
* or the camera.
*
* This specific function retrieves one specific named entry, and not the full
* tree to allow for querying specific settings faster.
*
* If you do not have configuration ability, there is no need to specify this
* function.
*
* \returns a gphoto error code
*/
typedef int (*CameraGetSingleConfigFunc) (Camera *camera, const char *name, CameraWidget **widget,
GPContext *context);
/**
* \brief List all configuration widgets for a specific configuration
*
* \param camera the current camera
* \param list the list of widgets available
* \param context the active #GPContext
*
* A camera driver can support configuration of either its own behaviour
* or the camera device itself. To allow a flexible driver framework,
* the camera driver provides a generic configuration widget tree to the
* frontend, which then renders it, allows user input and sends it back
* via the #CameraSetConfigFunc function to have the driver configure itself
* or the camera.
*
* This specific function retrieves all the available configuration values in a flat list.
*
* This is different than the GetConfigFunc, which returns a configuration tree.
*
* If you do not have configuration ability, there is no need to specify this
* function.
*
* \returns a gphoto error code
*/
typedef int (*CameraListConfigFunc) (Camera *camera, CameraList *list, GPContext *context);
/**
* \brief Set the configuration in the camera
*
* \param camera the current camera
* \param widget the configuration widget tree that was changed
* \param context the active #GPContext
*
* This function is called in the driver after the configuration is set.
* It is called directly after setting the value and might called multiple
* times (or never) after just one #CameraGetConfigFunc.
*
* \returns a gphoto error code
*/
typedef int (*CameraSetConfigFunc) (Camera *camera, CameraWidget *widget,
GPContext *context);
/**
* \brief Set a single configuration variable in the camera
*
* \param camera the current camera
* \param name the widget to set
* \param widget the configuration widget tree that was changed
* \param context the active #GPContext
*
* This function is called in the driver after the configuration value is set.
*
* \returns a gphoto error code
*/
typedef int (*CameraSetSingleConfigFunc) (Camera *camera, const char *name, CameraWidget *widget,
GPContext *context);
typedef int (*CameraCaptureFunc) (Camera *camera, CameraCaptureType type,
CameraFilePath *path, GPContext *context);
typedef int (*CameraTriggerCaptureFunc) (Camera *camera, GPContext *context);
typedef int (*CameraCapturePreviewFunc) (Camera *camera, CameraFile *file,
GPContext *context);
typedef int (*CameraSummaryFunc) (Camera *camera, CameraText *text,
GPContext *context);
typedef int (*CameraManualFunc) (Camera *camera, CameraText *text,
GPContext *context);
typedef int (*CameraAboutFunc) (Camera *camera, CameraText *text,
GPContext *context);
typedef int (*CameraWaitForEvent) (Camera *camera, int timeout,
CameraEventType *eventtype, void **eventdata,
GPContext *context);
/**@}*/
/**
* \param camera a \ref Camera object
* \param context a \ref GPContext object
* \return a gphoto2 error code
*
* Implement this function in the camera driver if the camera needs to
* be initialized before or reset the after each access from
* libgphoto2.
*
* For example, you would probably set the speed to the highest one
* right before downloading an image, and reset it to the default speed
* afterwards so that other programs will not be affected by this speed
* change.
*/
typedef int (*CameraPrePostFunc) (Camera *camera, GPContext *context);
/**
* \brief Various camera specific functions.
*
* This structure contains various pointers to functions that apply to
* the camera itself, and not the filesystem (which is handled by the
* filesystem functions). Set the ones you want to provide, leave the rest
* unset.
*
* This structure should only used by the driver itself, the frontend
* should use the gp_camera_xxx wrapper functions for it, who handle
* opening and locking around those hooks.
*/
typedef struct _CameraFunctions {
CameraPrePostFunc pre_func; /**< \brief Function called before each camera operation. */
CameraPrePostFunc post_func; /**< \brief Function called after each camera operation. */
CameraExitFunc exit; /**< \brief Function called on closing the camera. */
/* Configuration */
CameraGetConfigFunc get_config; /**< \brief Called for requesting the configuration widgets. */
CameraSetConfigFunc set_config; /**< \brief Called after a configuration was changed */
CameraListConfigFunc list_config; /**< \brief Called for listing the available configuration widgets. */
CameraGetSingleConfigFunc get_single_config; /**< \brief Called for requesteing a single widget. */
CameraSetSingleConfigFunc set_single_config; /**< \brief Called for setting a single configuration widget. */
/* Capturing */
CameraCaptureFunc capture; /**< \brief Remote control the camera to capture */
CameraTriggerCaptureFunc trigger_capture;/**< \brief Remote control the camera to trigger capture */
CameraCapturePreviewFunc capture_preview;/**< \brief Preview viewfinder content. */
/* Textual information */
CameraSummaryFunc summary; /**< \brief Give a summary about the current camera status, translated. */
CameraManualFunc manual; /**< \brief Give a brief manual about any specific items a user has to know, translated. */
CameraAboutFunc about; /**< \brief A little About text, including authors and credits. */
/* Event Interface */
CameraWaitForEvent wait_for_event; /**< \brief Wait for a specific event from the camera */
/* Reserved space to use in the future without changing the struct size */
void *reserved1; /**< \brief reserved for future use */
void *reserved2; /**< \brief reserved for future use */
void *reserved3; /**< \brief reserved for future use */
void *reserved4; /**< \brief reserved for future use */
void *reserved5; /**< \brief reserved for future use */
void *reserved6; /**< \brief reserved for future use */
void *reserved7; /**< \brief reserved for future use */
void *reserved8; /**< \brief reserved for future use */
} CameraFunctions;
typedef struct _CameraPrivateLibrary CameraPrivateLibrary;
typedef struct _CameraPrivateCore CameraPrivateCore;
struct _Camera {
/** \name Those should be accessed only by the camera driver.
* @{ */
GPPort *port;
CameraFilesystem *fs;
CameraFunctions *functions;
/**@}*/
CameraPrivateLibrary *pl; /**< Private data of camera libraries. */
CameraPrivateCore *pc; /**< Private data of the core of gphoto2. */
};
/** Create a new camera device. */
int gp_camera_new (Camera **camera);
/** \name Preparing initialization
* @{
*/
int gp_camera_set_abilities (Camera *camera, CameraAbilities abilities);
int gp_camera_get_abilities (Camera *camera, CameraAbilities *abilities);
int gp_camera_set_port_info (Camera *camera, GPPortInfo info);
int gp_camera_get_port_info (Camera *camera, GPPortInfo *info);
/**@}*/
/**
* \name camera speed
*
* You normally don't use that. If you do, you prevent the camera driver
* from selecting the optimal speed.
*
* @{
*/
int gp_camera_set_port_speed (Camera *camera, int speed);
int gp_camera_get_port_speed (Camera *camera);
/**@}*/
/** \name Initialization
* @{
*/
int gp_camera_autodetect (CameraList *list, GPContext *context);
int gp_camera_init (Camera *camera, GPContext *context);
int gp_camera_exit (Camera *camera, GPContext *context);
/**@}*/
/** \name Operations on cameras
* @{
*/
int gp_camera_ref (Camera *camera);
int gp_camera_unref (Camera *camera);
int gp_camera_free (Camera *camera);
int gp_camera_get_config (Camera *camera, CameraWidget **window,
GPContext *context);
int gp_camera_list_config (Camera *camera, CameraList *list,
GPContext *context);
int gp_camera_get_single_config (Camera *camera, const char *name, CameraWidget **widget,
GPContext *context);
int gp_camera_set_config (Camera *camera, CameraWidget *window,
GPContext *context);
int gp_camera_set_single_config (Camera *camera, const char *name, CameraWidget *widget,
GPContext *context);
int gp_camera_get_summary (Camera *camera, CameraText *summary,
GPContext *context);
int gp_camera_get_manual (Camera *camera, CameraText *manual,
GPContext *context);
int gp_camera_get_about (Camera *camera, CameraText *about,
GPContext *context);
int gp_camera_capture (Camera *camera, CameraCaptureType type,
CameraFilePath *path, GPContext *context);
int gp_camera_trigger_capture (Camera *camera, GPContext *context);
int gp_camera_capture_preview (Camera *camera, CameraFile *file,
GPContext *context);
int gp_camera_wait_for_event (Camera *camera, int timeout,
CameraEventType *eventtype, void **eventdata,
GPContext *context);
int gp_camera_get_storageinfo (Camera *camera, CameraStorageInformation**,
int *, GPContext *context);
/**@}*/
/** \name Operations on folders
* @{
*/
int gp_camera_folder_list_files (Camera *camera, const char *folder,
CameraList *list, GPContext *context);
int gp_camera_folder_list_folders (Camera *camera, const char *folder,
CameraList *list, GPContext *context);
int gp_camera_folder_delete_all (Camera *camera, const char *folder,
GPContext *context);
int gp_camera_folder_put_file (Camera *camera,
const char *folder, const char *filename,
CameraFileType type,
CameraFile *file, GPContext *context);
int gp_camera_folder_make_dir (Camera *camera, const char *folder,
const char *name, GPContext *context);
int gp_camera_folder_remove_dir (Camera *camera, const char *folder,
const char *name, GPContext *context);
/**@}*/
/** \name Operations on files
* @{
*/
int gp_camera_file_get_info (Camera *camera, const char *folder,
const char *file, CameraFileInfo *info,
GPContext *context);
int gp_camera_file_set_info (Camera *camera, const char *folder,
const char *file, CameraFileInfo info,
GPContext *context);
int gp_camera_file_get (Camera *camera, const char *folder,
const char *file, CameraFileType type,
CameraFile *camera_file, GPContext *context);
int gp_camera_file_read (Camera *camera, const char *folder, const char *file,
CameraFileType type,
uint64_t offset, char *buf, uint64_t *size,
GPContext *context);
int gp_camera_file_delete (Camera *camera, const char *folder,
const char *file, GPContext *context);
/**@}*/
/**
* \name Some cameras need 'keep-alive-messages'.
* @{
*/
typedef int (* CameraTimeoutFunc) (Camera *camera,
GPContext *context);
typedef unsigned int (* CameraTimeoutStartFunc) (Camera *camera,
unsigned int timeout,
CameraTimeoutFunc func,
void *data);
typedef void (* CameraTimeoutStopFunc) (Camera *camera,
unsigned int id, void *data);
void gp_camera_set_timeout_funcs (Camera *camera,
CameraTimeoutStartFunc start_func,
CameraTimeoutStopFunc stop_func,
void *data);
int gp_camera_start_timeout (Camera *camera, unsigned int timeout,
CameraTimeoutFunc func);
void gp_camera_stop_timeout (Camera *camera, unsigned int id);
/**@}*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* !defined(LIBGPHOTO2_GPHOTO2_CAMERA_H) */