//----------------------------------------------------------------------
// (C) Copyright 2004-2019 NetVision Corporation All rights reserved.
//----------------------------------------------------------------------
// <Module Name> SVIUSB20.DLL V/R = 0.00
//----------------------------------------------------------------------
// <File Name>   SVIUSB20.H
//----------------------------------------------------------------------
// <Description>
// SVI　USB版DLLインクルードファイル
// VC6.0使用
// <History>
//	2019/08/06	REC_PARAM_EX構造体追加
//	2019/08/06	SVIUSB20_RecSTartEX API追加
//----------------------------------------------------------------------
// <Notes>
// SVI USB版画像入出力ライブラリーエントリー部
// ライブラリ仕様については"XS40553 SVI画像入力ライブラリー説明書"
// 参照のこと
//----------------------------------------------------------------------
#ifndef INC_SVIUSB20
#define INC_SVIUSB20
// 以下の ifdef ブロックは DLL から簡単にエクスポートさせるマクロを作成する標準的な方法です。
// この DLL 内のすべてのファイルはコマンドラインで定義された SVIUSB20_EXPORTS シンボル
// でコンパイルされます。このシンボルはこの DLL が使用するどのプロジェクト上でも未定義でなけ
// ればなりません。この方法ではソースファイルにこのファイルを含むすべてのプロジェクトが DLL
// からインポートされたものとして SVIUSB20_API 関数を参照し、そのためこの DLL はこのマク
// ロで定義されたシンボルをエクスポートされたものとして参照します。
#ifdef SVIUSB20_EXPORTS
#define SVIUSB20_API extern "C" __declspec(dllexport)
#else
#define SVIUSB20_API extern "C" __declspec(dllimport)
#endif

// このクラスは SVIUSB20.dll からエクスポートされます
#ifdef SVIUSB20_EXPORTS
class __declspec(dllexport) CSVIUSB20 {
public:
	CSVIUSB20(void);
	// TODO: この位置にメソッドを追加してください。
};
#else
class __declspec(dllimport) CSVIUSB20 {
public:
	CSVIUSB20(void);
	// TODO: この位置にメソッドを追加してください。
};
#endif

// サポート・ライブラリ・エラーコード定義
#define	SVIUSB20_RET_NORMAL				0x1
#define	SVIUSB20_RET_ERROR_DEVICE		0xe0000000
#define	SVIUSB20_RET_ERROR_DEVOPEN		0xf0000001
#define	SVIUSB20_RET_ERROR_MULTIOPEN	0xf0000002
#define	SVIUSB20_RET_ERROR_NOOPEN		0xf0000003
#define	SVIUSB20_RET_ERROR_PARAMETER	0xf0000004
#define	SVIUSB20_RET_ERROR_COM			0xf0000005
#define	SVIUSB20_RET_ERROR_NOIDLE		0xf0000006
#define	SVIUSB20_RET_ERROR_FMUPDATE_T	0xf0000007
#define	SVIUSB20_RET_ERROR_FPUPDATE_T	0xf0000008
#define	SVIUSB20_RET_ERROR_GSTS2_T		0xf0000009
#define	SVIUSB20_RET_ERROR_MDATA_T		0xf000000a
#define	SVIUSB20_RET_ERROR_SVI			0xf1000000

// ファーム、FPGAアップデート終了監視タイムアウト値の定義
#define	DEF_FIRMUPDATE_TIMEOUT	15	// 1:1sec 15秒
#define	DEF_FPGAUPDATE_TIMEOUT	15	// 1:1sec 15秒
#define	DEF_GSTS2_TIMEOUT		50	// 1:10msec 500ミリ秒
#define	DEF_MONGET_TIMEOUT		10	// 1:100msec 1秒

// SVIUSB20_Open() パラメータ用定義
#define	SVIUSB20_APP_WHO_REC	1L
#define	SVIUSB20_APP_WHO_CTL	2L

typedef struct _READWRITE_BLOCK {
	USHORT	Off_High;	// Destination Offset (bit47-bit32)
	ULONG	Off_Low;	// Destination Offset (bit31-bit00)
	ULONG	Quad_dat;	// Quadlet Data
} READWRITE_BLOCK, *PREADWRITE_BLOCK;

// SVIUSB20_GetStatus() パラメータ用定義
#define SVI_STS_SUCCESS        0x0001  // 正常終了
#define SVI_STS_FRAMEPENDING   0x0002  // 正常終了 (保留フレーム/データあり)
#define SVI_STS_CAPCANCELED    0x0003  // 正常終了 (キャプチャが中止された)
#define SVI_STS_BUSY           0x0011  // ビジーでコマンドが実行できない
#define SVI_STS_RECOVERYMODE   0x0012  // リカバリーモードのためコマンドが実行できない
#define SVI_STS_I2CACTIVE      0x0013  // I2Cコントローラアクティブ
#define SVI_STS_CMD_INVALID    0x0101  // コマンドが不正である
#define SVI_STS_PRM_INVALID    0x0102  // パラメータが不正である
#define SVI_STS_SEQ_INVALID    0x0103  // パケットの発行シーケンスが不正である
#define SVI_STS_CAM_POWER_OFF  0x0104  // カメラ電源OFFである
#define SVI_STS_I2C_ACKTIMEOUT 0x0601  // I2CでスレーブからのACKを受信できずタイムアウトが発生した
#define SVI_STS_I2C_PRETIMEOUT 0x0602  // I2Cでプリタイムアウトが発生した
#define SVI_STS_I2C_POSTTIMEOUT 0x0603 // I2Cでポストタイムアウトが発生した
#define SVI_STS_USB_ERROR      0x0C01  // USB通信時にエラーが発生した
#define SVI_STS_UPDATE_INVALID 0x0E01  // モジュールデータが不正である
#define SVI_STS_FROMERS_ERROR  0x0E02  // フラッシュメモリーの消去に失敗した
#define SVI_STS_FROMWT_ERROR   0x0E03  // フラッシュメモリーの書き込みに失敗した
#define SVI_STS_INTERNAL_ERROR 0x0F01  // 内部エラーが発生した
#define SVI_STS_RESOURCE_ERROR 0x0F02  // 内部リソースが不足して処理が実行できない

#define	SVI_STS_ERR_MASK			0xF00
#define	SVIUSB20_GETSTATUS_STS_OK	SVI_STS_SUCCESS

typedef struct _GET_STATUS {
	ULONG	ulBasicStatus;		// 取込ハードウェアの基本ステータス（1H:正常、その他:異常）
	ULONG	ulHWVersion;		// ハードウェアのバージョン番号
	ULONG	ulFWVersion;		// ファームウェアのバージョン番号
	ULONG	ulOPStatus;			// 現在の動作モード
								//	0:アイドル、1:モニタリング中
								//	2:レコーディング中、8:アップデート中
	ULONG	ulStartupStatus;	// ファームウェア起動ステータス（0:ノーマル、1:リカバリ）
	ULONG	ulOrgSizeW;			// カメラが出力している画像サイズの幅
	ULONG	ulOrgSizeH;			// カメラが出力している画像サイズの高さ
	ULONG	ulCutout_x;			// オリジナル画像の左上端からの切り出し範囲の左上端のX座標
	ULONG	ulCutout_y;			// オリジナル画像の左上端からの切り出し範囲の左上端のY座標
	ULONG	ulCutSizeW;			// 切り出し後の画像サイズの幅
	ULONG	ulCutSizeH;			// 切り出し後の画像サイズの高さ
	ULONG	ulCamStatus;		// カメラステータス
								//	D0-7:信号ステータス
								//	D8-15:デジタル映像データ
#if 1 // 2019.08.14 V9.0.9.0 SVI-09&SVM-06のみ
	ULONG	ulCamFps;			// カメラが出力しているフレームレート（100倍された値）
#endif // 2019.08.14 V9.0.9.0 SVI-09&SVM-06のみ
} GET_STATUS, *PGET_STATUS;

// SVIUSB20_SetParam() パラメータ用定義
#define	SVIUSB20_SETPARAM_BIT0	0x1
#define	SVIUSB20_SETPARAM_BIT1	0x2
#define	SVIUSB20_SETPARAM_BIT2	0x4
#define	SVIUSB20_SETPARAM_BIT3	0x8
#define	SVIUSB20_SETPARAM_BIT4	0x10
#define	SVIUSB20_SETPARAM_BIT5	0x20
#define	SVIUSB20_SETPARAM_BIT6	0x40
#define	SVIUSB20_SETPARAM_SPEED_100		0x0
#define	SVIUSB20_SETPARAM_SPEED_200		0x1
#define	SVIUSB20_SETPARAM_SPEED_400		0x1
#define	SVIUSB20_SETPARAM_CAMPOWER_OF	0x0
#define	SVIUSB20_SETPARAM_CAMPOWER_ON	0x1
#define	SVIUSB20_SETPARAM_I2CSPEED_4	0x0
#define	SVIUSB20_SETPARAM_I2CSPEED_2	0x1
#define	SVIUSB20_SETPARAM_I2CSPEED_1	0x2

typedef struct _SET_PARAM {
	ULONG	ulParamBitFlag;		// 以下のパラメータの有効(1)/無効(0)を指定する
								//	SVIUSB20_SETPARAM_BIT0 : 画像情報通知
								//	SVIUSB20_SETPARAM_BIT1 : カメラ電源スイッチ
								//	SVIUSB20_SETPARAM_BIT2 : I2Cスピード
								//	SVIUSB20_SETPARAM_BIT3 : 予約
								//	SVIUSB20_SETPARAM_BIT4 : 予約
								//	SVIUSB20_SETPARAM_BIT5 : VSYNCデアサートフラグ
								//	SVIUSB20_SETPARAM_BIT6 : モニタリングモードフラグ
								//　複数指定はOR演算子を使用
	ULONG	ulVsyncFlag;		// VSYNCデアサートフラグ	0　:　デアサートを待つ - 初期値
								//							1　:　デアサートを待たない
	ULONG	ulCamPower;			// カメラ電源スイッチ（0:OFF、1:ON）
	ULONG	ulI2CSpeed;			// I2Cスピード（0:400Kbps、1:200Kbps、2:100Kbps）
	ULONG	ulMonMode;			// モニタリングモード（バッファ分割数 2~16)
	ULONG	ulPixelInfo;		// 画像情報通知	bit0-1 : 色成分数(1or2or3)
								//				bit2   : 1色分のビット幅(0:8bit,1:16bit)
} SET_PARAM, *PSET_PARAM;

typedef struct _MONITOR_PARAM {
	ULONG	ulCutout_x;			// オリジナル画像の左上端からの切り出し範囲の左上端のX座標
	ULONG	ulCutout_y;			// オリジナル画像の左上端からの切り出し範囲の左上端のY座標
	ULONG	ulCutout_w;			// 切り出し範囲の幅（偶数）
	ULONG	ulCutout_h;			// 切り出し範囲の高さ（偶数）
} MONITOR_PARAM, *PMONITOR_PARAM;

typedef struct _MON_HEADER {
	ULONG	ulStatus;			// 実行結果のステータス（1H:成功、その他:異常）
	ULONG	ulPendingInfo;		// 保留フレーム数
	ULONG	ulOrgSizeW;			// カメラが出力している画像サイズの幅
	ULONG	ulOrgSizeH;			// カメラが出力している画像サイズの高さ
	ULONG	ulCutout_x;			// オリジナル画像の左上端からの切り出し範囲の左上端のX座標
	ULONG	ulCutout_y;			// オリジナル画像の左上端からの切り出し範囲の左上端のY座標
	ULONG	ulMonSizeW;			// 切り出し後の画像サイズの幅
	ULONG	ulMonSizeH;			// 切り出し後の画像サイズの高さ
	ULONG	ulFrameRate;		// カメラが出力している画像のフレームレート
	ULONG	ulLoseFrame;		// 前フレームから本フレーム間に破棄したフレーム数
	ULONG	ulOpticalAxisInfo;	// 前フレームから本フレーム間に破棄したフレーム数
	USHORT	usCursorX;			// 十字カーソルのX座標
	USHORT	usCursorY;			// 十字カーソルのY座標
	USHORT	usWakuLeftX;		// 枠の左上のX座標
	USHORT	usWakuLeftY;		// 枠の左上のY座標
	USHORT	usWakuRightX;		// 枠の右下のX座標
	USHORT	usWakuRightY;		// 枠の右下のY座標
	ULONG	ulReserve1;			// 予約
	ULONG	ulVsyncReadLen;		// V同期読み出しのデータ長（0-448）
	ULONG	ulVsyncVal[448/4];	// V同期読み出しのデータ
} MON_HEADER, *PMON_HEADER;

typedef struct _RECORD_PARAM {
	ULONG	ulFrameCount;		// レコーディングフレーム数
	ULONG	ulBufferCount;		// レコーディングサイズ（バイト）
	ULONG	ulRecMode;			// レコーディングモード
								//  bit31（0:Recording、1:Monitoring&SaveMem）
								//  bit30-bit01（予約）
								//  bit00（0:フレーム数、1:サイズ）
} RECORD_PARAM, *PRECORD_PARAM;

typedef struct _RECORD_PARAM_EX {
	ULONG	ulRecMode;			// レコーディングモード
								//  bit31（0:CAN-0 Not recording、1:CAN-0 recording）
								//  bit30（0:CAN-1 Not recording、1:CAN-1 recording）
								//  bit29-bit00（予約）
} RECORD_PARAM_EX, *PRECORD_PARAM_EX;

///
typedef struct _GET_MIPI_INFO {
	ULONG	ulLaneInfo;			// レーン情報
	ULONG	ulDataTypeInfo;		// DataType 情報
	ULONG	ulFpsInfo;			// FPS 情報 ビデオ・フレームの周期を 1[us] 単位で示します
	ULONG	ulDepp;				// 画像幅情報
	ULONG	ulDepr;				// 画像高さ情報
	ULONG	ulClk;				// MIPI 1 レーン当 たりのビット・レートを 1/16 した値を KHz 単位で示します
} GET_MIPI_INFO, *PGET_MIPI_INFO;


typedef struct _SET_MIPI_PARAM {
	ULONG	ulSelectDataType;		// Data Type
	ULONG	ulSelectNumberOfLanes;	// 取り込みレーン数
	ULONG	ulSelectVirtualChannel;	// 取り込む VC No.
	ULONG	ulIncludingEmbeddesLine;// Embeded データ取り込みフラグ
} SET_MIPI_PARAM, *PSET_MIPI_PARAM;

typedef struct _GET_BOARD_INFO {
	ULONG	ulBoardKind;			// ボード種類 (1:SVM, 2:SVI, 0:Other)
	ULONG	ulBoardSeries;			// ボードシリーズ (6:SVM-06, 9:SVI-09, 0:Other)
	ULONG	ulCustomCode;			// FPGA カスタムコード
} GET_BOARD_INFO, *PGET_BOARD_INFO;

///

#pragma pack(1)
typedef struct _REC_HEADER {
	ULONG	ulStatus;			// 実行結果のステータス（1H:成功、その他:異常）
	ULONG	ulPendingInfo;		// 保留レコーディングデータサイズ
	UCHAR	ubFirmVersion;		// ファームウェアバージョン番号
	UCHAR	ubHardVersion;		// ハードウェアバージョン番号
	USHORT	usNumChannel;		// チャネル数（1h固定）
	UCHAR	ubCompFlag;			// 圧縮フラグ（0:非圧縮、1:圧縮）
	ULONG	ulNumScan;			// データサイズ
	USHORT	usDataWidth;		// データ幅（0:8bits、1:16bits）
	UCHAR	ulReserve[1];		// 予約
	ULONG	ulRecHeaderSize;	// Monitoring&Save2時のレコーディングフレームヘッダーサイズ
} REC_HEADER, *PREC_HEADER;
#pragma pack()

// SVIUSB20_I2CStart() パラメータ用定義
#define	SVIUSB20_I2CSTART_PARAM_OFF	0x0	// I2Cリードシーケンスなし
#define	SVIUSB20_I2CSTART_PARAM_ON	0x1	// I2Cリードシーケンスあり

// SVIUSB20_I2COneByteRead() パラメータ用定義
#define	SVIUSB20_I2CREADSET_PARAM_NOACK	0x0	// I2Cリード時ACK送信なし
#define	SVIUSB20_I2CREADSET_PARAM_ACK	0x1	// I2Cリード時ACK送信あり

SVIUSB20_API void SVIUSB20_Init( void );
SVIUSB20_API DWORD SVIUSB20_Open(ULONG ulAppWho);
SVIUSB20_API DWORD SVIUSB20_Close(ULONG ulAppWho);
SVIUSB20_API DWORD SVIUSB20_BusReset(void);
SVIUSB20_API DWORD SVIUSB20_DeviceReset(void);
SVIUSB20_API DWORD SVIUSB20_GetStatus(PGET_STATUS pGetStatus);
SVIUSB20_API DWORD SVIUSB20_SetParam(PSET_PARAM pParam);
SVIUSB20_API DWORD SVIUSB20_MonStart(PMONITOR_PARAM pMonParam);
SVIUSB20_API DWORD SVIUSB20_MonStop(void);
SVIUSB20_API DWORD SVIUSB20_MonGetHeader(PMON_HEADER pHeader);
SVIUSB20_API DWORD SVIUSB20_MonGetFrame(LPVOID lpFrameBuf, ULONG ulRcvLen, PULONG pulRetRcvLen);
SVIUSB20_API DWORD SVIUSB20_RecStart(PRECORD_PARAM pRecParam);
SVIUSB20_API DWORD SVIUSB20_RecStop(void);
SVIUSB20_API DWORD SVIUSB20_RecGetHeader(PREC_HEADER pHeader);
SVIUSB20_API DWORD SVIUSB20_RecGetFrames(LPVOID lpFrameBuf, ULONG ulRcvLen, PULONG pulRetRcvLen);
SVIUSB20_API DWORD SVIUSB20_I2CStop(void);
SVIUSB20_API DWORD SVIUSB20_FirmwareUpdate(LPVOID lpFirmData, ULONG ulDataSize);
SVIUSB20_API DWORD SVIUSB20_FpgaUpdate(LPVOID lpFpgaData, ULONG ulDataSize);
SVIUSB20_API DWORD SVIUSB20_GetStatus2(PULONG pulStatus);
SVIUSB20_API DWORD SVIUSB20_I2COneBlockWrite (ULONG	ulSlaveAdr,	ULONG	ulLen,	ULONG	ulWriteMode,	PUCHAR	pucSendBuf);	// 2004.10.21 ulWriteMode 追加
SVIUSB20_API DWORD SVIUSB20_I2COneBlockRead (ULONG	ulSlaveAdr,	ULONG	ulLen,	ULONG	ulReadMode,		PUCHAR	pucRcvBuf);		// 2004.10.21 ulReadMode 追加
SVIUSB20_API DWORD SVIUSB20_I2CBufferWrite ( ULONG	ulLen, ULONG	ulWriteMode, PUCHAR	pucBuffer );	// 2005.05.06 関数追加
SVIUSB20_API DWORD SVIUSB20_GetUSBDesc(int	iFlag);
SVIUSB20_API DWORD SVIUSB20_GpioAcc(ULONG ulMode, ULONG	ulBitMask, PULONG pulData, ULONG ulRsv);
SVIUSB20_API DWORD SVIUSB20_PllUpdate(LPVOID lpPllData, ULONG ulDataSize);
SVIUSB20_API DWORD SVIUSB20_GetVersion( char *pcVerBuf );
SVIUSB20_API void  SVIUSB20_End( void );
SVIUSB20_API void SVIUSB20_DeviceSelect( ULONG ulBoardNo );
SVIUSB20_API void SVIUSB20_DeviceRelease( void );
SVIUSB20_API DWORD SVIUSB20_EnumDevice( ULONG ulAppWho, PULONG pulSVI_Num, PULONG pulSVI_NumTable );
SVIUSB20_API DWORD SVIUSB20_PllSet(LPVOID lpPllData, ULONG ulDataSize);
SVIUSB20_API DWORD SVIUSB20_I2COneBlockReadEx(ULONG ulSlaveAdr, ULONG ulSubAdr, ULONG ulLen, ULONG ulReadMode, PUCHAR pucRcvBuf);
SVIUSB20_API DWORD SVIUSB20_Fx3FirmUpdate(
			LPVOID lpFirmData,	// FX3用ファームウェア・アップデータ格納ポインタ
			ULONG ulDataSize	// アップデータバイトサイズ(64の倍数)
		);
SVIUSB20_API DWORD SVIUSB20_ReconfFpgaupdate(
			LPVOID lpFpgaData,	// 動的再配置用FPGAデータ・アップデータ格納ポインタ
			ULONG ulDataSize	// アップデータバイトサイズ(64の倍数)
		);
SVIUSB20_API DWORD SVIUSB20_HaitaOnOff(ULONG ulOnOffFlag);
SVIUSB20_API DWORD SVIUSB20_RecStartEx(PRECORD_PARAM_EX pRecParam);
SVIUSB20_API DWORD SVIUSB20_RecGetData(LPVOID lpFrameBuf, ULONG ulRcvLen, PULONG pulRetRcvLen);

SVIUSB20_API DWORD SVIUSB20_GetMipiInfomation(PGET_MIPI_INFO pInfo);
SVIUSB20_API DWORD SVIUSB20_SetMipiParameter(PSET_MIPI_PARAM pInfo);
SVIUSB20_API DWORD SVIUSB20_GetBoardInfo(PGET_BOARD_INFO pInfo);

#endif
