Logo Search packages:      
Sourcecode: libgphoto2 version File versions

sierra-desc.h

/* sierra_desc.h:
 *
 * Copyright  2002 Patrick Mansfield <patman@aracnet.com>
 *
 * 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.
 *
 * 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. 
 *
 * 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., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Define a set of structures to describe the register layouts of a
 * digital camera, based on the Nikon Coolpix 880 (sierra). Only camera
 * configuration/settings are handled here.
 *
 * The lowest level structs are first, followed by the higher levels.
 *
 * These structures can't be in one single struct, since they are variable
 * length, and each level has a slightly different set of functionallity.
 *
 * Generally, we have a CameraRegisterSetType with pointers to
 * CameraRegisterType registers; each register in turn has pointers to
 * RegisterDescriptorType's; each RegisterDescriptorType has pointers to
 * ValueNameType's; the ValueNameType is a value and corresponding
 * description (string).
 */

#ifndef __SIERRA_DESC_H__
#define __SIERRA_DESC_H__

#define     SIZE_ADDR(type, var)    (sizeof(var)/sizeof(type)), (type*) var

#define     VAL_NAME_INIT(name)     \
            SIZE_ADDR(ValueNameType, name)

#define     CAM_REG_TYPE_INIT(prefix, reg, rsize, get_set, action)      \
      { reg, rsize, 0, { get_set, action }, \
            SIZE_ADDR(RegisterDescriptorType, prefix##_reg_##reg), \
      }

#define GP_REG_NO_MASK  ~0      /* XXX long or int or ? */

typedef enum {
      CAM_DESC_DEFAULT, /* use standard sierra get/set int/string
                           functions, depending on reg_len */
      CAM_DESC_SUBACTION,     /* use standard get int/string, but use the
                           sierr_sub_action to set values */
} RegGetSetType;

typedef struct {
      RegGetSetType method;
      int   action;     /* if we are CAM_DESC_ACTION, the action to use.
                   * The sub-action is stored in the name-value
                   * field. This is probably not good enough for the
                   * standard action (calling sierra_action versus
                   * calling sierra_sub_action).
                   */
} GetSetType;

typedef struct {
      union {
            /* 
             * The register value masked with regs_mask gives the
             * register value to compare or use here.  Register values
             * are always int, and must be converted to/from float for
             * range values.  The proper value to user here is based
             * on the reg_len size and the reg_widget_type.
             *
             * For fields like the exp compensation, or the zoom,
             * where the first x bytes are used, and it looks like the
             * rest are a fixed value: just mask them out, and use the
             * values read from the camera.
             */
            int64_t value;    /* GP_WIDGET_RADIO */
            float range[3];   /* GP_WIDGET_RANGE these are
                           min/max/stepping; if stepping is zero,
                           a stepping of one is used. */
            CameraWidgetCallback callback; /* GP_WIDGET_BUTTON */
      } u;
      /* 
       * Range uses no name - the name is implicitly the value. XXX Move name
       * up into a struct with value.
       */
      char *name; /* name matching the value */
} ValueNameType;

typedef struct {
      CameraWidgetType reg_widget_type;
      uint32_t regs_mask;
      char *regs_short_name;        /* for command line use */
      char *regs_long_name;         /* for gui/curses use */
      uint32_t reg_val_name_cnt;    /* number of regs_value_names entries */
      ValueNameType *regs_value_names;    /* list of reg value/names */
} RegisterDescriptorType;

/* 
 * XXX check usage of reg_value, maybe change it to char x[8], and
 * normally type cast its usage.
 */
typedef struct {
      uint32_t reg_number;    /* register number */
      uint32_t reg_len; /* size in bytes of data at register */
      uint64_t reg_value;     /* stored value, has no valid initial value;
                         * The size would have to be increased, or
                         * this space must be allocated for
                         * register values longer than 8 bytes. */
      GetSetType  reg_get_set;
      uint32_t reg_desc_cnt;  /* number of reg_desc entries */
      RegisterDescriptorType *reg_desc; /* list of reg descriptors */
} CameraRegisterType;

typedef struct CameraRegisterSet {
      char *window_name;
      uint32_t reg_cnt;
      CameraRegisterType *regs;
} CameraRegisterSetType;

typedef struct CameraDesc {
      const CameraRegisterSetType *regset;
      const char * const manual;
      const SierraFlags flags;
} CameraDescType;

/*
 * oly-desc.c:
 */
extern const CameraDescType sierra_default_cam_desc;
extern const CameraDescType oly750uz_cam_desc;
extern const CameraDescType oly3040_cam_desc;
extern const CameraDescType oly3000z_cam_desc;

/*
 * nikon-desc.c:
 */
extern const CameraDescType cp880_cam_desc;
extern const CameraDescType cp995_cam_desc;
extern const CameraDescType cp2500_cam_desc;

/*
 * epson-desc.c:
 */
extern const CameraDescType ep3000z_cam_desc;

#endif /* __SIERRA_DESC_H__ */

Generated by  Doxygen 1.6.0   Back to index