/*==================================================================

	EKUSB
		昇華形USBプリンタ用制御ツール

		COPYRIGHT (C) 2011 (2013) Eastman Kodak Company

  		2013.03.08	Ver.2.0.0

==================================================================*/		

#ifndef _EKUSB_h_
#define _EKUSB_h_

#ifdef __cplusplus
extern "C" {
#endif

#pragma pack(8)	/* 8バイト境界 *////*8 bytes boundaries*/


/*-----------------------------------------------------------------------------
	EKInit
		DLLの初期化//DLL initialization
-----------------------------------------------------------------------------*/

void WINAPI EKInit( void );
typedef void (WINAPI* PFNEKInit)( void );

/*-----------------------------------------------------------------------------
	EKSearchPrinters
		複数プリンタのUSB接続番号とプリンタ機種IDの取得//Acquires USB connection No. and printer model ID of two or more printers.
-----------------------------------------------------------------------------*/

/*----- プリンタID -----*////*----- Printer ID -----*/
enum{
PRN_NotSupported = -1,

PRN_FirstPrinterID = 1,
PRN_EK305 = 3100
};

/*----- プリンタのID情報 -----*////*----- Printer ID information -----*/
typedef struct tagEKIDinfo{
short		usbNo;				/* USB接続番号 *////* USB connection No.*/
short		printerID;			/* プリンタの機種別ID *////* Printer model ID */
CHAR		serialNo[6];		/* プリンタのシリアル番号文字列 *////* Character string of printer serial number */
WORD		mediaType;			/* メディアタイプ *////* Media type */
}EKIDinfo, *PEKIDinfo;

DWORD WINAPI EKSearchPrinters( PEKIDinfo pIDInfo, DWORD infoSize, LPDWORD pSizeNeeded, LPDWORD pinfoNum );
typedef DWORD (WINAPI* PFNEKSearchPrinters)( PEKIDinfo pIDInfo, DWORD infoSize, LPDWORD pSizeNeeded, LPDWORD pinfoNum );

/*-----------------------------------------------------------------------------
	EKCheckPrinter
		プリンタの状態チェック//Printer status check
-----------------------------------------------------------------------------*/

/*----- プリンタのステータス情報 -----*////*----- Printer status information -----*/
typedef struct tagEKStatusInfo{
DWORD   printerStatus;   /* プリンタ状態 *////* Printer status */
DWORD   detail;          /* 詳細エラー情報 *////* Detail status */
DWORD   reserved2;       /* reserved */
DWORD   reserved3;       /* reserved */
}EKStatusInfo, *PEKStatusInfo;

DWORD WINAPI EKCheckPrinter( PEKStatusInfo pStInfo, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKCheckPrinter)( PEKStatusInfo pStInfo, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
	EKSendImagePrint
		プリンタに画像データを送り、プリントする//Sends image data to printer and print out
-----------------------------------------------------------------------------*/

/*-----  転送データの情報 -----*////*----- Transferred data information-----*/
typedef struct tagEKBandImageParams{
PVOID		baseAddr;			/* イメージデータへのポインタ *////* Pointer to image data */
long		rowBytes;			/* 1行内のバイト数 *////* Number of bytes in a line */
RECT		bounds;				/* 転送領域 *////* Transferred area */
}EKBandImageParams, *PEKBandImageParams;

/*-----  コントラストテーブル -----*/
typedef struct tagEKContrastTable{
BYTE		r[256];				/* 赤 *////* Red */
BYTE		g[256];				/* 緑 *////* Green */
BYTE		b[256];				/* 青 *////* Blue */
}EKContrastTable, *PEKContrastTable;

/*----- ガンマテーブル -----*/
typedef struct tagEKGammaTable {
    WORD   r[256];  /* the gamma table for red */
    WORD   g[256];  /* the gamma table for green */
    WORD   b[256];  /* the gamma table for blue */
}EKGammaTable, *PEKGammaTable;

/*----- 画像補正パラメータ -----*/
typedef struct tagEKImageEffectParams {
    DWORD   ver;                /* 構造体のバージョン 103を指定 *////* set the structure version : 103 */
    short   ColorTabel;         /* 色変換テーブルの指定 *////* Color table */
    short   DLLColorTabel;      /* DLL色変換テーブルの指定 *////* Color table for DLL */
    short   ContrastTabel;      /* コントラストテーブルの指定 *////* Contrast table */
    const   EKContrastTable* pContTbl;    /* コントラストテーブル構造体へのポインタ *////* A pointer which indicates the Contrast table */
    short   sharpness0;         /* シャープネス０ *////* Sharpness 0 */
    const   BYTE* pSharpnessTbl;	/* ユーザー定義シャープネステーブルへのポインタ *////* A pointer which indicates the Sharpness_User */
    short   sharpness1;         /* シャープネス１ *////* Sharpness 1 */
    short   gamma;              /* ガンマ *////* Gamma */
    short   printMode;          /* 印画モードの指定 *////* Printing mode */
    short   linesharpness;      /* ラインシャープネスの指定 *////* LineSharpness */
    const   EKGammaTable* pGammaTbl;    /* Gamma table for DLL */
    short   overcoatMode;       /* Over coat mode */
} EKImageEffectParams, *PEKImageEffectParams;

/* ガンマ *////* Gamma */
#define PGamma_1		0x101
#define PGamma_2		0x102
#define PGamma_3		0x103
#define PGamma_4		0x104
#define PGamma_5		0x105

/* 印画モード指定 *////* Print mode designation */
#define PPrintMode_1	0x101
#define PPrintMode_5	0x105

/* オーバーコートモード指定 *////* Overcoat mode designation */
#define POverCoat_Standard	0x101
#define POverCoat_Matte		0x102
#define POverCoat_Matte2	0x103

/*-----  プリンタの設定データ -----*////*-----  Printer configuration data -----*/
typedef struct tagEKPrinterParams {
    DWORD   ver;                /* 構造体のバージョン 103を指定 *////* set the structure version : 103 */
    DWORD   flags1;             /* 設定フラグ1 *////* Configuration flag 1 */
    DWORD   reserved1;          /* reserved */
    POINTS  printPixel;         /* 転送画素 *////* Transferred pixels */
    short   sidePrint;          /* サイドプリント *////* Side print */
    WORD    printCount;         /* プリント枚数 *////* Number of copies */
    short   overCoat;           /* オーバーコート *////* Overcoat */
    short   mirror;             /* ミラープリント *////* Mirror print */
    short   marginCut;          /* マージンカット *////* Margin cut */
    short   multiCut;           /* マルチカットタイプ(0--10,41h) *////* MultiCut Type(0--10,41h) */
    short   multipanel;         /* マルチパネル *////* Multi panel (support: ver 101 and later) */
    short   printOut;           /* 2枚取り端数出力設定(ver 102 以降で有効) */
    short   reserved4;          /* reserved */
    short   inkSkip;            /* インクスキップ設定(ver 103 以降で有効) *////* (support: ver 103 and later) */
}EKPrinterParams, *PEKPrinterParams;

/* 設定フラグ(flags1) *//* Configuration flags (flags1) */
#define CPS1_PrintCount				0x00000001L
#define CPS1_MultiCut				0x00000020L
#define CPS1_OverCoat				0x00000080L

typedef void (CALLBACK* PFNACBfunc)(DWORD dwErr, short PrintFlag, short PrintUsbNo, long nJid, int CopyNumber);

DWORD WINAPI EKSendImagePrint( const EKPrinterParams* setP, const EKBandImageParams* pBandImage,
	const EKImageEffectParams* piep, BOOL memClear, PFNACBfunc pfncb, long nJid, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKSendImagePrint)( const EKPrinterParams* setP, const EKBandImageParams* pBandImage,
	const EKImageEffectParams* piep, BOOL memClear, PFNACBfunc pfncb, long nJid, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
	EKCheckPaperRemain
		残量枚数のチェック// Warning of paper-out condition
-----------------------------------------------------------------------------*/

/*-----  残量枚数の情報 -----*////*-----  Paper-Remain information -----*/
typedef struct tagEKPaperRemainParams{
short		restNum;			/* (out)残量 *////* (out)Remaining paper volume*/
BOOL		isWarning;			/* (out)残量警告 *////* (out)Display low paper warning with remaining paper volume*/
}EKPaperRemainParams, *PEKPaperRemainParams;

DWORD WINAPI EKCheckPaperRemain( PEKPaperRemainParams pPaperRemain, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKCheckPaperRemain)( PEKPaperRemainParams pPaperRemain, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
	EKGetTotalPrintCount
		 トータルプリント枚数の取得//Acquires total page count printed
-----------------------------------------------------------------------------*/

DWORD WINAPI EKGetTotalPrintCount( PDWORD pdwCount, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKGetTotalPrintCount)( PDWORD pdwCount, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
	EKGetFWInfo
		プリンタのファームウェアバージョン情報の取得//Acquires printer firmware version information
-----------------------------------------------------------------------------*/

/*----- ファームウェアバージョン情報 -----*////*----- Firmware version information -----*/
typedef struct tagEKFWInfo{
char		version_info1[6];	/* バージョン情報１ *////* Version information 1 */
char		version_info2[6];	/* バージョン情報２ *////* Version information 2 */
char		version_info3[6];	/* バージョン情報３ *////* Version information 3 */
}EKFWInfo, *PEKFWInfo;

DWORD WINAPI EKGetFWInfo( PEKFWInfo pFWInfo, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKGetFWInfo)( PEKFWInfo pFWInfo, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
	EKGetMediaType
		メディア情報の取得
-----------------------------------------------------------------------------*/

typedef struct tagEKMediaType{
WORD		mediaType;			/* メディアの種類 */
WORD		mediaDetail;		/* メディアの種類 */
WORD		reserved;			/* reserved */
}EKMediaType, *PEKMediaType;

DWORD WINAPI EKGetMediaType( PEKMediaType pMType, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKGetMediaType)( PEKMediaType pMType, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
	EKGetErrorHistory
		エラー履歴の取得//Acquire error history
-----------------------------------------------------------------------------*/

typedef struct tagEKErrorHistory{
BYTE errCode;			/* エラーコード */
BYTE errStatus;			/* エラーステータス */
DWORD totalPrintCount;	/* エラー発生時のトータル枚数 */
}EKErrorHistory, *PEKErrorHistory;

DWORD WINAPI EKGetErrorHistory( PEKErrorHistory pHistory, PEKIDinfo pIDInfo );
typedef DWORD (WINAPI* PFNEKGetErrorHistory)( PEKErrorHistory pHistory, PEKIDinfo pIDInfo );

/*-----------------------------------------------------------------------------
    EKPrintOutorClear
        EKSendImagePrint関数で実行した印刷ジョブの排出/クリア設定
-----------------------------------------------------------------------------*/

DWORD WINAPI EKPrintOutorClear(short printOutflag, PEKIDinfo pIDInfo);
typedef DWORD (WINAPI* PFNEKPrintOutorClear)(short printOutflag, PEKIDinfo pIDInfo);

/*-----------------------------------------------------------------------------
    EKCheckInkSkip
        プリンター情報取得の捨て数（インク半面スキップ数）をチェックする
-----------------------------------------------------------------------------*/

typedef struct tagEKInkSkipParams{
short inkSkipNumLower;
short inkSkipNumUpper;
BOOL  reserved;
}EKInkSkipParams, *PEKInkSkipParams;

DWORD WINAPI EKCheckInkSkip(PEKInkSkipParams pInkSkip, PEKIDinfo pIDInfo);
typedef DWORD (WINAPI* PFNEKCheckInkSkip)(PEKInkSkipParams pInkSkip, PEKIDinfo pIDInfo);

/*-----------------------------------------------------------------------------
    EKInkSkip
        新しいインクで次のJOBを印刷する
-----------------------------------------------------------------------------*/

DWORD WINAPI EKInkSkip(PEKIDinfo pIDInfo);
typedef DWORD (WINAPI* PFNEKInkSkip)(PEKIDinfo pIDInfo);

/*-----------------------------------------------------------------------------
    EKPreHeat
        プリヒートコマンド発行
-----------------------------------------------------------------------------*/

DWORD WINAPI EKPreHeat(PEKIDinfo pIDInfo);
typedef DWORD (WINAPI* PFNEKPreHeat)(PEKIDinfo pIDInfo);



/*-----------------------------------------------------------------------------
	ステータスコード//Status code
-----------------------------------------------------------------------------*/

enum{
PStatus_Ready = 0,				/* 待機中 *////* Ready */
PStatus_Printing,				/* プリント中 *////* Printing */
PStatus_MechaInit,				/* メカ初期化中 *////* Initializing printer */
PStatus_FeedandCut				/* Feed & Cut 中 *////* Feeding & Cutting */
};


/*-----------------------------------------------------------------------------
	エラーコード
-----------------------------------------------------------------------------*/

enum{
Error_NoError = 0,				/* エラー無し *////* No error */
Error_Something,				/* 何らかのエラー(1) *////* Unidentified error */

Error_DeviceNotFound = 100,		/* プリンタが見つからない(100) *////* Printer could not be found */
Error_Busy,						/* プリンタが反応しない *////* No response from printer */
Error_Printing_Busy,			/* プリント中. データ転送不可 *////* Printer is now printing. Cannot send image data */
Error_PortBusy = 104,			/* ポートが使用中でオープンできない. *////* Can't open the USB port. */
Error_GetCPDIDinfo,				/* プリンタ情報の取得に失敗 *////* Can't get complete CPDIDinfo information. */
Error_PrinterBusy,				/* Can't set command */

Error_FuncParamError = 201,     /* DLL関数の引数が不正 *////* Illegal argument of DLL function */
Error_MemAllocError,            /* DLLで使用するメモリの確保に失敗した *////* Failed to allocate memory to DLL */
Error_Timeout,                  /* ポートオープン処理でタイムアウトした *////* Timeout error for SearchPrinters function */

Error_InvalidParam = 1000,		/* 無効なパラメータ(1000) *////* Invalid parameter */
Error_SheetEnd,					/* インクシートがない *////* Ink sheet is missing */
Error_PaperEnd,					/* 用紙がない *////* Paper-out */
Error_PaperJam,					/* 紙ジャムの発生 *////* Paper jam */
Error_SheetJam,					/* インクシートジャムの発生 */
Error_PaperSheetIllegal = 1006,	/* 用紙とインクシートの組み合わせが間違っている *////* Illegal combination of media and ink sheet */
Error_PaperSizeIllegal = 1008,	/* 用紙が規格紙でない *////* Unsupported media was detected */
Error_HeatError = 1011,			/* 高温異常が発生 *////* High temperature error */
Error_DoorOpen = 1013,			/* プリンタのドアが開いている *////* Printer door is open */
Error_UnusableSheet,            /* 使用できないインクシートを検出 *////* Detected ink sheet is unusable */
Error_SheetCassetIllegal,       /* インクシートカセットが規格外。(1015) */
								///* Ink sheet information acquisition error (ink sheet is not installed） */
Error_PaperRemain,              /* 用紙終了を検出 *////* Paper-out was detected */
Error_SheetRemain,              /* インクシートICチップの残量がない *////* Ink sheet is almost depleted */
Error_NotSupported,             /* プリンタが未対応の機能を実行しようとした *////* Printer tried to perform unsupported operation */ 

Error_SheetMarkError = 1101,    /* インクシートマークエラー *////* Ink sheet mark error */
Error_PaperJam_D,               /* 紙ジャムの発生. ドアオープン＆クローズが必要 *////* Paper Jam.  Please open/close printer door */
Error_MechaError,               /* メカエラー *////* Hardware error */
Error_MechaError_D,             /* メカエラー. ドアオープン＆クローズが必要 *////* Hardware error. Please open/close printer door */
Error_MechaInitReq,             /* メカ初期化要求(1105) *////* Printer initialization was requested */
Error_PrintingTurnOff,          /* 印画中電源遮断検出 *////* Power-off was detected while printing */
Error_PrinterError = 1109,      /* プリンタエラー *////* Printer error */
Error_NoScrapBox = 1111,		/* 屑ボックスなし *////* No Scrap box */
Error_PrintingDoorOpen,         /* 印刷中ドアオープン *////* Door open while printing */
Error_SheetError,               /* インクリボンエラー *////* Ink ribbon error */
Error_SheetCountError,			/* インクシートのカウントが不正 *////* Ink Sheet count error */

Error_JInvalidParam	=1300,		/* 画像転送コマンドパラメータが不正*/
Error_JMemoryFull,				/* メモリの空きが無い */
Error_JPaperSizeIllegal = 1310,	/* 画像サイズ設定とメディアサイズの不一致 */
Error_JLastJobError,			/* 前ジョブでのエラーありで終了 */
Error_JTimeout = 1320,			/* タイムアウト等による中断 */
Error_JJobCancel,				/* キャンセルコマンドによる中断 */
Error_JUSBInterrupt				/* USB通信切断による中断 */
};


#pragma pack()

#ifdef __cplusplus
}	/* extern "C" */
#endif

#endif /* _EKUSB_h_ */

/*--------------------------- end of EKUSB.h -----------------------------*/
