/** @file u12-scanner.h
 *  @brief Definitions for the devices.
 *
 * Copyright (c) 2003-2004 Gerhard Jaeger <gerhard@gjaeger.de>
 *
 * History:
 * - 0.01 - initial version
 * - 0.02 - removed useless stuff
 * .
 * <hr>
 * 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.
 * <hr>
 */
#ifndef __U12_SCANNER_H__
#define __U12_SCANNER_H__

/* definitions for the timer functions
 */
typedef double TimerDef;
#define _MSECOND    1000             /* based on 1 us */
#define _SECOND     (1000*_MSECOND)

#if 1
#define _DO_UDELAY(usecs)   u12io_udelay(usecs)
#define _DODELAY(msecs)     u12io_udelay(1000*msecs)
/*{ int i; for( i = msecs; i--; ) _DO_UDELAY(1000); }*/
#else
#define _DODELAY(msecs) 
#endif

/* ModuleStates */
#define _MotorInNormalState 0
#define _MotorGoBackward    1
#define _MotorInStopState   2
#define _MotorAdvancing     3
#define _MotorAdvanced      4


/** some function types
 */
typedef struct u12d *pU12_Device;
typedef struct svd  *pShadingVarDef;
typedef void      (*pFnVoid)(pU12_Device);
typedef void      (*pFnDACOffs)(pU12_Device, pShadingVarDef, u_long);
typedef void      (*pFnDACDark)(pU12_Device, pShadingVarDef, u_long, u_short);
typedef void      (*pFnDataProcess)(pU12_Device, void*, void*, u_long);
typedef SANE_Bool (*pFnBool)(pU12_Device);


/* useful for RGB-values */
typedef struct {
	SANE_Byte Red;
	SANE_Byte Green;
	SANE_Byte Blue;
} RGBByteDef;

typedef struct {
	u_short Red;
	u_short Green;
	u_short Blue;
} RGBUShortDef;

typedef struct {
	u_long Red;
	u_long Green;
	u_long Blue;
} RGBULongDef;

typedef union {
	RGBByteDef Colors;
	SANE_Byte  bColors[3];
} ColorByte;

typedef union {
	RGBUShortDef Colors;
	u_short      wColors[3];
} ColorWord;

typedef union {
	SANE_Byte     *pb;
	u_short       *pw;
	u_long        *pdw;
	RGBUShortDef  *pusrgb;
	RGBULongDef   *pulrgb;
	RGBByteDef    *pbrgb;
} DataPointer;

typedef struct
{
	union {
		SANE_Byte *bp;
		u_short   *usp;
		u_long    *ulp;
	} red;
	union {
		SANE_Byte *bp;
		u_short   *usp;
		u_long    *ulp;
	} green;
	union {
		SANE_Byte *bp;
		u_short   *usp;
		u_long    *ulp;
	} blue;

} RBGPtrDef;

typedef struct {
	SANE_Byte b1st;
	SANE_Byte b2nd;
} WordVal;

typedef struct {
	WordVal w1st;
	WordVal w2nd;
} DWordVal;


typedef union {
	WordVal   wOverlap;
	DWordVal  dwOverlap;
	u_long    dwValue;
	u_short   wValue;
	SANE_Byte bValue;
} DataType;

typedef struct {
	u_short exposureTime;
	u_short xStepTime;
} ExpXStepDef;

typedef struct {
	SANE_Byte reg;
	SANE_Byte val;
} RegDef;

/** for defining a point
 */
typedef struct {
	u_short x;
	u_short y;
} XY;

/** for defining a crop area, all is 300DPI based
 */
typedef struct {
	u_short x;      /**< x-pos of top-left corner */
	u_short y;      /**< y-pos of top-left corner */
	u_short cx;     /**< width                    */
	u_short cy;     /**< height                   */
} CropRect;

/** for defining an image
 */
typedef struct {
	u_long   dwFlag;      /**< i.e. image source           */
	CropRect crArea;      /**< the image size and position */
	XY       xyDpi;       /**< the resolution              */
	u_short  wDataType;   /**< and the data type           */
} ImgDef;

/**
 */
typedef struct {
	u_long dwPixelsPerLine;
	u_long dwBytesPerLine;
	u_long dwLinesPerArea;
	ImgDef image;
} CropInfo;

/** all we need for a scan
 */
typedef struct
{
	u_long  dwScanFlag;
	double  xyRatio;  /**< for scaling */
	u_short wYSum;

	XY      xyPhyDpi; /**< physical resolution of a scan */
	u_long  dwPhysBytesPerLine;
	u_long  wPhyDataType;         /**< how the scanner should scan */

	u_long  dwAsicPixelsPerPlane;
	u_long  dwAsicBytesPerPlane;
	u_long  dwAsicBytesPerLine;

	XY      xyAppDpi;
	u_long  dwAppLinesPerArea;
	u_long  dwAppPixelsPerLine;
	u_long  dwAppPhyBytesPerLine;
	u_long  dwAppBytesPerLine;
	u_short wAppDataType;

	short   siBrightness;
	short   siContrast;

	CropRect crImage;
} DataInfo;

/** this will be our global "overkill" structure
 */
typedef struct
{
	pFnDataProcess  DataProcess;    /* to convert RGB buffers to RGB pixels */
	pFnBool         DoSample;
	pFnBool         DataRead;       /* function to get data from scanner    */

	long            lBufferAdjust;
	u_long          dwScanOrigin;   /* where to start the scan              */
	u_long          negBegin;       /* used while scanning in TPA modes     */
	u_long          posBegin;
	SANE_Byte       bDiscardAll;

	union {
		u_short     wGreenDiscard;
		u_short     wGreenKeep;
	} gd_gk;
	union {
		u_short     wBlueDiscard;
		u_short     wRedKeep;
	} bd_rk;

	u_long          dpiIdx;         /* index to get/set values in the table */
	ExpXStepDef    *negScan;        /* reference to exposure/xtep table     */

	DataPointer     p48BitBuf;      /* for handling 48-bit data             */
	RBGPtrDef       BufBegin;       /* for reading/writing the scan-data    */
	RBGPtrDef       BufEnd;
	RBGPtrDef       BufGet;
	RBGPtrDef       BufData;
	RBGPtrDef       BufPut;

	/* motor movement stuff */
	u_long          dwInterval;
	SANE_Bool       refreshState;
	SANE_Bool       motorBackward;
	SANE_Byte       oldScanState;
	SANE_Byte       bRefresh;
	SANE_Byte       bModuleState;
	SANE_Byte       bNowScanState;

	/* internal FIFO management */
	u_long          dwMinReadFifo;
	u_long          dwMaxReadFifo;
	SANE_Byte       bFifoSelect;    /* defines which FIFO to use            */

} ScanInfo;

/** structure for accessing one buffer in various ways...
 */
typedef struct
{
	union {
		SANE_Byte   *pReadBuf;
		SANE_Byte   *pShadingMap;
		u_short     *pShadingRam;
		DataPointer  Buf;
	} b1;

	union {
		SANE_Byte    *pSumBuf;
		RGBUShortDef *pSumRGB;
	} b2;

	DataPointer TpaBuf;
} BufferDef;

#endif	/* guard __U12_SCANNER_H__ */

/* END U12-SCANNER.H ........................................................*/