kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			
		
			
				
	
	
		
			517 wiersze
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			517 wiersze
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
| /* sane - Scanner Access Now Easy.
 | |
|    Copyright (C) 2007 Jeremy Johnson
 | |
|    This file is part of a SANE backend for Ricoh IS450
 | |
|    and IS420 family of HS2P Scanners using the SCSI controller.
 | |
| 
 | |
|    This file is part of the SANE package.
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License as
 | |
|    published by the Free Software Foundation; either version 2 of the
 | |
|    License, or (at your option) any later version.
 | |
| 
 | |
|    This program 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
 | |
|    General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 | |
|    MA 02111-1307, USA.
 | |
| 
 | |
|    As a special exception, the authors of SANE give permission for
 | |
|    additional uses of the libraries contained in this release of SANE.
 | |
| 
 | |
|    The exception is that, if you link a SANE library with other files
 | |
|    to produce an executable, this does not by itself cause the
 | |
|    resulting executable to be covered by the GNU General Public
 | |
|    License.  Your use of that executable is in no way restricted on
 | |
|    account of linking the SANE library code into it.
 | |
| 
 | |
|    This exception does not, however, invalidate any other reasons why
 | |
|    the executable file might be covered by the GNU General Public
 | |
|    License.
 | |
| 
 | |
|    If you submit changes to SANE to the maintainers to be included in
 | |
|    a subsequent release, you agree by submitting the changes that
 | |
|    those changes may be distributed with this exception intact.
 | |
| 
 | |
|    If you write modifications of your own for SANE, it is your choice
 | |
|    whether to permit this exception to apply to your modifications.
 | |
|    If you do not wish that, delete this exception notice. */
 | |
| 
 | |
| #ifndef HS2P_H
 | |
| #define HS2P_H 1
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include "../include/sane/config.h"
 | |
| 
 | |
| #include "hs2p-scsi.h"
 | |
| #include "hs2p-saneopts.h"
 | |
| 
 | |
| #define HS2P_CONFIG_FILE "hs2p.conf"
 | |
| 
 | |
| #define DBG_error0       0
 | |
| #define DBG_error        1
 | |
| #define DBG_sense        2
 | |
| #define DBG_warning      3
 | |
| #define DBG_inquiry      4
 | |
| #define DBG_info         5
 | |
| #define DBG_info2        6
 | |
| #define DBG_proc         7
 | |
| #define DBG_read         8
 | |
| #define DBG_sane_init   10
 | |
| #define DBG_sane_proc   11
 | |
| #define DBG_sane_info   12
 | |
| #define DBG_sane_option 13
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|   const char *mfg;
 | |
|   const char *model;
 | |
| } HS2P_HWEntry;
 | |
| 
 | |
| enum CONNECTION_TYPES
 | |
| { CONNECTION_SCSI = 0, CONNECTION_USB };
 | |
| 
 | |
| enum media
 | |
| { FLATBED = 0x00, SIMPLEX, DUPLEX };
 | |
| 
 | |
| 
 | |
| typedef struct data
 | |
| {
 | |
|   size_t bufsize;
 | |
|   /* 00H IMAGE */
 | |
|   /* 01H RESERVED */
 | |
|   /* 02H Halftone Mask  */
 | |
|   SANE_Byte gamma[256];		/* 03H Gamma Function */
 | |
|   /* 04H - 7FH Reserved */
 | |
|   SANE_Byte endorser[19];	/* 80H Endorser */
 | |
|   SANE_Byte size;		/* 81H startpos(4bits) + width(4bits) */
 | |
|   /* 82H Reserved */
 | |
|   /* 83H Reserved (Vendor Unique) */
 | |
|   SANE_Byte nlines[5];		/* 84H Page Length */
 | |
|   MAINTENANCE_DATA maintenance;	/* 85H */
 | |
|   SANE_Byte adf_status;		/* 86H */
 | |
|   /* 87H Reserved (Skew Data) */
 | |
|   /* 88H-91H Reserved (Vendor Unique) */
 | |
|   /* 92H Reserved (Scanner Extension I/O Access) */
 | |
|   /* 93H Reserved (Vendor Unique) */
 | |
|   /* 94H-FFH Reserved (Vendor Unique) */
 | |
| } HS2P_DATA;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|   SANE_Range xres_range;
 | |
|   SANE_Range yres_range;
 | |
|   SANE_Range x_range;
 | |
|   SANE_Range y_range;
 | |
| 
 | |
|   SANE_Int window_width;
 | |
|   SANE_Int window_height;
 | |
| 
 | |
|   SANE_Range brightness_range;
 | |
|   SANE_Range contrast_range;
 | |
|   SANE_Range threshold_range;
 | |
| 
 | |
|   char inquiry_data[256];
 | |
| 
 | |
|   SANE_Byte max_win_sections;	/* Number of supported window subsections
 | |
| 				   IS450 supports max of 4 sections
 | |
| 				   IS420 supports max of 6 sections
 | |
| 				 */
 | |
| 
 | |
|   /* Defaults */
 | |
|   SANE_Int default_res;
 | |
|   SANE_Int default_xres;
 | |
|   SANE_Int default_yres;
 | |
|   SANE_Int default_imagecomposition;	/* [lineart], halftone, grayscale, color */
 | |
|   SANE_Int default_media;	/* [flatbed], simplex, duplex */
 | |
|   SANE_Int default_paper_size;	/* [letter], legal, ledger, ... */
 | |
|   SANE_Int default_brightness;
 | |
|   SANE_Int default_contrast;
 | |
|   SANE_Int default_gamma;	/* Normal, Soft, Sharp, Linear, User */
 | |
|   SANE_Bool default_adf;
 | |
|   SANE_Bool default_duplex;
 | |
|   /*
 | |
|      SANE_Bool default_border;
 | |
|      SANE_Bool default_batch;
 | |
|      SANE_Bool default_deskew;
 | |
|      SANE_Bool default_check_adf;
 | |
|      SANE_Int  default_timeout_adf;
 | |
|      SANE_Int  default_timeout_manual;
 | |
|      SANE_Bool default_control_panel;
 | |
|    */
 | |
| 
 | |
|   /* Mode Page Parameters */
 | |
|   MP_CXN cxn;			/* hdr + Connection Parameters */
 | |
| 
 | |
|   SANE_Int bmu;
 | |
|   SANE_Int mud;
 | |
|   SANE_Int white_balance;	/* 00H Relative, 01H Absolute; power on default is relative */
 | |
|   /* Lamp Timer not supported */
 | |
|   SANE_Int adf_control;		/* 00H None, 01H Book, 01H Simplex, 02H Duplex */
 | |
|   SANE_Int adf_mode_control;	/* bit2: prefeed mode invalid: "0" : valid "1" */
 | |
|   /* Medium Wait Timer not supported */
 | |
|   SANE_Int endorser_control;	/* Default Off when power on */
 | |
|   SANE_Char endorser_string[20];
 | |
|   SANE_Bool scan_wait_mode;	/* wait for operator panel start button to be pressed */
 | |
|   SANE_Bool service_mode;	/* power on default self_diagnostics 00H; 01H optical_adjustment */
 | |
| 
 | |
|   /* standard information: EVPD bit is 0 */
 | |
|   SANE_Byte devtype;		/* devtype[6]="scanner" */
 | |
|   SANE_Char vendor[9];		/* model name 8+1 */
 | |
|   SANE_Char product[17];	/* product name 16+1 */
 | |
|   SANE_Char revision[5];	/* revision 4+1 */
 | |
| 
 | |
|   /* VPD information: EVPD bit is 1, Page Code=C0H */
 | |
|   /* adf_id: 0: No ADF
 | |
|    *         1: Single-sided ADF
 | |
|    *         2: Double-sided ADF
 | |
|    *         3: ARDF (Reverse double-sided ADF)
 | |
|    *         4: Reserved
 | |
|    */
 | |
| 
 | |
|   SANE_Bool hasADF;		/* If YES; can either be one of Simplex,Duplex,ARDF */
 | |
|   SANE_Bool hasSimplex;
 | |
|   SANE_Bool hasDuplex;
 | |
|   SANE_Bool hasARDF;
 | |
| 
 | |
|   SANE_Bool hasEndorser;
 | |
| 
 | |
|   SANE_Bool hasIPU;
 | |
|   SANE_Bool hasXBD;
 | |
| 
 | |
|   /* VPD Image Composition */
 | |
|   SANE_Bool supports_lineart;
 | |
|   SANE_Bool supports_dithering;
 | |
|   SANE_Bool supports_errordiffusion;
 | |
|   SANE_Bool supports_color;
 | |
|   SANE_Bool supports_4bitgray;
 | |
|   SANE_Bool supports_8bitgray;
 | |
| 
 | |
|   /* VPD Image Data Processing ACE (supported for IS420) */
 | |
|   SANE_Bool supports_whiteframing;
 | |
|   SANE_Bool supports_blackframing;
 | |
|   SANE_Bool supports_edgeextraction;
 | |
|   SANE_Bool supports_noiseremoval;	/* supported for IS450 if IPU installed */
 | |
|   SANE_Bool supports_smoothing;	/* supported for IS450 if IPU installed */
 | |
|   SANE_Bool supports_linebolding;
 | |
| 
 | |
|   /* VPD Compression (not supported for IS450) */
 | |
|   SANE_Bool supports_MH;
 | |
|   SANE_Bool supports_MR;
 | |
|   SANE_Bool supports_MMR;
 | |
|   SANE_Bool supports_MHB;
 | |
| 
 | |
|   /* VPD Marker Recognition (not supported for IS450) */
 | |
|   SANE_Bool supports_markerrecognition;
 | |
| 
 | |
|   /* VPD Size Recognition (supported for IS450 if IPU installed) */
 | |
|   SANE_Bool supports_sizerecognition;
 | |
| 
 | |
|   /* VPD X Maximum Output Pixel: IS450:4960   IS420:4880 */
 | |
|   SANE_Int xmaxoutputpixels;
 | |
| 
 | |
|   /* jis information VPD IDENTIFIER Page Code F0H */
 | |
|   SANE_Int resBasicX;		/* basic X resolution */
 | |
|   SANE_Int resBasicY;		/* basic Y resolution */
 | |
|   SANE_Int resXstep;		/* resolution step in main scan direction */
 | |
|   SANE_Int resYstep;		/* resolution step in sub scan direction */
 | |
|   SANE_Int resMaxX;		/* maximum X resolution */
 | |
|   SANE_Int resMaxY;		/* maximum Y resolution */
 | |
|   SANE_Int resMinX;		/* minimum X resolution */
 | |
|   SANE_Int resMinY;		/* minimum Y resolution */
 | |
|   SANE_Int resStdList[16 + 1];	/* list of available standard resolutions (first slot is the length) */
 | |
|   SANE_Int winWidth;		/* length of window (in BasicX res DPI) */
 | |
|   SANE_Int winHeight;		/* height of window (in BasicY res DPI) */
 | |
|   /* jis.functions duplicates vpd.imagecomposition lineart/dither/grayscale */
 | |
|   SANE_Bool overflow_support;
 | |
|   SANE_Bool lineart_support;
 | |
|   SANE_Bool dither_support;
 | |
|   SANE_Bool grayscale_support;
 | |
| 
 | |
| } HS2P_Info;
 | |
| 
 | |
| typedef struct HS2P_Device
 | |
| {
 | |
|   struct HS2P_Device *next;
 | |
|   /*
 | |
|    * struct with pointers to device/vendor/model names, and a type value
 | |
|    * used to inform sane frontend about the device
 | |
|    */
 | |
|   SANE_Device sane;
 | |
|   HS2P_Info info;
 | |
|   SENSE_DATA sense_data;
 | |
| } HS2P_Device;
 | |
| 
 | |
| #define GAMMA_LENGTH 256
 | |
| typedef struct HS2P_Scanner
 | |
| {
 | |
|   /* all the state needed to define a scan request: */
 | |
|   struct HS2P_Scanner *next;	/* linked list for housekeeping */
 | |
|   int fd;			/* SCSI filedescriptor */
 | |
| 
 | |
|   /* --------------------------------------------------------------------- */
 | |
|   /* immutable values which are set during reading of config file.         */
 | |
|   int buffer_size;		/* for sanei_open */
 | |
|   int connection;		/* hardware interface type */
 | |
| 
 | |
| 
 | |
|   /* SANE option descriptors and values */
 | |
|   SANE_Option_Descriptor opt[NUM_OPTIONS];
 | |
|   Option_Value val[NUM_OPTIONS];
 | |
|   SANE_Parameters params;	/* SANE image parameters */
 | |
|   /* additional values that don't fit into Option_Value representation */
 | |
|   SANE_Word gamma_table[GAMMA_LENGTH];	/* Custom Gray Gamma Table */
 | |
| 
 | |
|   /* state information - not options */
 | |
| 
 | |
|   /* scanner dependent/low-level state: */
 | |
|   HS2P_Device *hw;
 | |
| 
 | |
|   SANE_Int bmu;			/* Basic Measurement Unit       */
 | |
|   SANE_Int mud;			/* Measurement Unit Divisor     */
 | |
|   SANE_Byte image_composition;	/* LINEART, HALFTONE, GRAYSCALE */
 | |
|   SANE_Byte bpp;		/* 1,4,6,or 8 Bits Per Pixel    */
 | |
| 
 | |
| 
 | |
|   u_long InvalidBytes;
 | |
|   size_t bytes_to_read;
 | |
|   SANE_Bool cancelled;
 | |
|   /*SANE_Bool backpage; */
 | |
|   SANE_Bool scanning;
 | |
|   SANE_Bool another_side;
 | |
|   SANE_Bool EOM;
 | |
| 
 | |
|   HS2P_DATA data;
 | |
| } HS2P_Scanner;
 | |
| 
 | |
| static const SANE_Range u8_range = {
 | |
|   0,				/* minimum */
 | |
|   255,				/* maximum */
 | |
|   0				/* quantization */
 | |
| };
 | |
| static const SANE_Range u16_range = {
 | |
|   0,				/* minimum */
 | |
|   65535,			/* maximum */
 | |
|   0				/* quantization */
 | |
| };
 | |
| 
 | |
| #define SM_LINEART        SANE_VALUE_SCAN_MODE_LINEART
 | |
| #define SM_HALFTONE       SANE_VALUE_SCAN_MODE_HALFTONE
 | |
| #define SM_DITHER         "Dither"
 | |
| #define SM_ERRORDIFFUSION "Error Diffusion"
 | |
| #define SM_COLOR          SANE_VALUE_SCAN_MODE_COLOR
 | |
| #define SM_4BITGRAY       "4-Bit Gray"
 | |
| #define SM_6BITGRAY       "6-Bit Gray"
 | |
| #define SM_8BITGRAY       "8-Bit Gray"
 | |
| static SANE_String scan_mode_list[9];
 | |
| enum
 | |
| { FB, ADF };
 | |
| static SANE_String_Const scan_source_list[] = {
 | |
|   "FB",				/* Flatbed */
 | |
|   "ADF",			/* Automatic Document Feeder */
 | |
|   NULL
 | |
| };
 | |
| static SANE_String compression_list[6];	/* "none", "g31d MH", "g32d MR", "g42d MMR", "MH byte boundary", NULL} */
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|   SANE_String name;
 | |
|   double width, length;		/* paper dimensions in mm */
 | |
| } HS2P_Paper;
 | |
| /* list of support paper sizes */
 | |
| /* 'custom' MUST be item 0; otherwise a width or length of 0 indicates
 | |
|  * the maximum value supported by the scanner
 | |
|  */
 | |
| static const HS2P_Paper paper_sizes[] = {	/* Name, Width, Height in mm */
 | |
|   {"Custom", 0.0, 0.0},
 | |
|   {"Letter", 215.9, 279.4},
 | |
|   {"Legal", 215.9, 355.6},
 | |
|   {"Ledger", 279.4, 431.8},
 | |
|   {"A3", 297, 420},
 | |
|   {"A4", 210, 297},
 | |
|   {"A4R", 297, 210},
 | |
|   {"A5", 148.5, 210},
 | |
|   {"A5R", 210, 148.5},
 | |
|   {"A6", 105, 148.5},
 | |
|   {"B4", 250, 353},
 | |
|   {"B5", 182, 257},
 | |
|   {"Full", 0.0, 0.0},
 | |
| };
 | |
| 
 | |
| #define PORTRAIT "Portait"
 | |
| #define LANDSCAPE "Landscape"
 | |
| static SANE_String_Const orientation_list[] = {
 | |
|   PORTRAIT,
 | |
|   LANDSCAPE,
 | |
|   NULL				/* sentinel */
 | |
| };
 | |
| 
 | |
| /* MUST be kept in sync with paper_sizes */
 | |
| static SANE_String_Const paper_list[] = {
 | |
|   "Custom",
 | |
|   "Letter",
 | |
|   "Legal",
 | |
|   "Ledger",
 | |
|   "A3",
 | |
|   "A4", "A4R",
 | |
|   "A5", "A5R",
 | |
|   "A6",
 | |
|   "B4",
 | |
|   "B5",
 | |
|   "Full",
 | |
|   NULL				/* (not the same as "") sentinel */
 | |
| };
 | |
| 
 | |
| #if 0
 | |
| static /* inline */ int _is_host_little_endian (void);
 | |
| static /* inline */ int
 | |
| _is_host_little_endian ()
 | |
| {
 | |
|   SANE_Int val = 255;
 | |
|   unsigned char *firstbyte = (unsigned char *) &val;
 | |
| 
 | |
|   return (*firstbyte == 255) ? SANE_TRUE : SANE_FALSE;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static /* inline */ void
 | |
| _lto2b (u_long val, SANE_Byte * bytes)
 | |
| {
 | |
|   bytes[0] = (val >> 8) & 0xff;
 | |
|   bytes[1] = val & 0xff;
 | |
| }
 | |
| 
 | |
| static /* inline */ void
 | |
| _lto3b (u_long val, SANE_Byte * bytes)
 | |
| {
 | |
|   bytes[0] = (val >> 16) & 0xff;
 | |
|   bytes[1] = (val >> 8) & 0xff;
 | |
|   bytes[2] = val & 0xff;
 | |
| }
 | |
| 
 | |
| static /* inline */ void
 | |
| _lto4b (u_long val, SANE_Byte * bytes)
 | |
| {
 | |
|   bytes[0] = (val >> 24) & 0xff;
 | |
|   bytes[1] = (val >> 16) & 0xff;
 | |
|   bytes[2] = (val >> 8) & 0xff;
 | |
|   bytes[3] = val & 0xff;
 | |
| }
 | |
| 
 | |
| static /* inline */ u_long
 | |
| _2btol (SANE_Byte * bytes)
 | |
| {
 | |
|   u_long rv;
 | |
| 
 | |
|   rv = (bytes[0] << 8) | bytes[1];
 | |
| 
 | |
|   return rv;
 | |
| }
 | |
| 
 | |
| static /* inline */ u_long
 | |
| _4btol (SANE_Byte * bytes)
 | |
| {
 | |
|   u_long rv;
 | |
| 
 | |
|   rv = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
 | |
| 
 | |
|   return rv;
 | |
| }
 | |
| 
 | |
| /*
 | |
| static inline SANE_Int
 | |
| _2btol(SANE_Byte *bytes)
 | |
| {
 | |
|   SANE_Int rv;
 | |
| 
 | |
|   rv = (bytes[0] << 8) | bytes[1];
 | |
|   return (rv);
 | |
| }
 | |
| */
 | |
| static inline SANE_Int
 | |
| _3btol (SANE_Byte * bytes)
 | |
| {
 | |
|   SANE_Int rv;
 | |
| 
 | |
|   rv = (bytes[0] << 16) | (bytes[1] << 8) | bytes[2];
 | |
|   return (rv);
 | |
| }
 | |
| 
 | |
| /*
 | |
| static inline SANE_Int
 | |
| _4btol(SANE_Byte *bytes)
 | |
| {
 | |
|         SANE_Int rv;
 | |
| 
 | |
|         rv = (bytes[0] << 24) |
 | |
|              (bytes[1] << 16) |
 | |
|              (bytes[2] << 8) |
 | |
|              bytes[3];
 | |
|         return (rv);
 | |
| }
 | |
| */
 | |
| enum adf_ret_bytes
 | |
| { ADF_SELECTION = 2, ADF_MODE_CONTROL, MEDIUM_WAIT_TIMER };
 | |
| 
 | |
| #define get_paddingtype_id(s)  (get_list_index( paddingtype_list, (char *)(s) ))
 | |
| #define get_paddingtype_val(i) (paddingtype[ get_paddingtype_id( (i) ) ].val)
 | |
| #define get_paddingtype_strndx(v) (get_val_id_strndx(&paddingtype[0], NELEMS(paddingtype), (v)))
 | |
| 
 | |
| #define get_halftone_code_id(s)  (get_list_index( halftone_code, (char *)(s) ))
 | |
| #define get_halftone_code_val(i) (halftone[get_halftone_code_id( (i) ) ].val)
 | |
| 
 | |
| #define get_halftone_pattern_id(s)  (get_list_index( halftone_pattern_list, (char *)(s) ))
 | |
| #define get_halftone_pattern_val(i) (halftone[get_halftone_pattern_id( (i) ) ].val)
 | |
| 
 | |
| #define get_auto_binarization_id(s)  (get_list_index( auto_binarization_list, (char *)(s) ))
 | |
| #define get_auto_binarization_val(i) (auto_binarization[ get_auto_binarization_id( (i) ) ].val)
 | |
| 
 | |
| #define get_auto_separation_id(s)  (get_list_index( auto_separation_list, (char *)(s) ))
 | |
| #define get_auto_separation_val(i) (auto_separation[ get_auto_separation_id( (i) ) ].val)
 | |
| 
 | |
| #define get_noisematrix_id(s)    (get_list_index( noisematrix_list, (char *)(s) ))
 | |
| #define get_noisematrix_val(i)   (noisematrix[ get_noisematrix_id( (i) ) ].val)
 | |
| 
 | |
| #define get_grayfilter_id(s)    (get_list_index( grayfilter_list, (char *)(s) ))
 | |
| #define get_grayfilter_val(i)   (grayfilter[ get_grayfilter_id( (i) ) ].val)
 | |
| 
 | |
| #define get_paper_id(s)       (get_list_index( paper_list, (char *)(s) ))
 | |
| #define get_compression_id(s) (get_list_index( (const char **)compression_list, (char *)(s) ))
 | |
| #define get_scan_source_id(s) (get_list_index( (const char **)scan_source_list, (char *)(s) ))
 | |
| 
 | |
| #define reserve_unit(fd) (unit_cmd((fd),HS2P_SCSI_RESERVE_UNIT))
 | |
| #define release_unit(fd) (unit_cmd((fd),HS2P_SCSI_RELEASE_UNIT))
 | |
| 
 | |
| #define GET SANE_TRUE
 | |
| #define SET SANE_FALSE
 | |
| 
 | |
| #define get_endorser_control(fd,val)  (endorser_control( (fd), (val), GET ))
 | |
| #define set_endorser_control(fd,val)  (endorser_control( (fd), (val), SET ))
 | |
| 
 | |
| #define get_connection_parameters(fd,parm)  (connection_parameters( (fd), (parm), GET ))
 | |
| #define set_connection_parameters(fd,parm)  (connection_parameters( (fd), (parm), SET ))
 | |
| 
 | |
| #define get_adf_control(fd, a, b, c)      (adf_control( (fd), GET, (a), (b), (c) ))
 | |
| #define set_adf_control(fd, a, b, c)      (adf_control( (fd), SET, (a), (b), (c) ))
 | |
| 
 | |
| #define RELATIVE_WHITE 0x00
 | |
| #define ABSOLUTE_WHITE 0x01
 | |
| #define get_white_balance(fd,val)  (white_balance( (fd), (val), GET ))
 | |
| #define set_white_balance(fd,val)  (white_balance( (fd), (val), SET ))
 | |
| 
 | |
| #define get_scan_wait_mode(fd)      (scan_wait_mode( (fd),     0, GET ))
 | |
| #define set_scan_wait_mode(fd,val)  (scan_wait_mode( (fd), (val), SET ))
 | |
| 
 | |
| #define get_service_mode(fd)      (service_mode( (fd),     0, GET ))
 | |
| #define set_service_mode(fd,val)  (service_mode( (fd), (val), SET ))
 | |
| 
 | |
| #define isset_ILI(sd) ( ((sd).sense_key & 0x20) != 0)
 | |
| #define isset_EOM(sd) ( ((sd).sense_key & 0x40) != 0)
 | |
| 
 | |
| 
 | |
| #endif /* HS2P_H */
 |