/* ＡＩＧライブラリ　ＫＳＤサポート関数
	Copyright (C) 1997,98 by AIG-SOFT
*/
#ifndef	__AIG_KSD__
#define	__AIG_KSD__	1	/* ヘッダー読み込みシンボル */

#ifndef	__CLASS_H
#include <class.h>
#endif

/* 定数 */
#define	KSD_SYMBOL	"AIG-KSD"	/* デバイスシンボル */
#define	KSD_ST_SIZE	64	/* IOCTRL INに必要なバッファーサイズ */
#define	KSD_SEP		('/')	/* IOCTRL INの各データのセパレーター */

// 実際にはKSDDevName()を使えば、これらのデバイス名定数を使うことはない
//（通常は使わないように）
#define	KSD_NAME	"@KEY"		/* デバイス名 通常 */
#define	KSD_NAME2	"@KSD"		/* デバイス名 /K時 */

// 外部起動プログラムテーブル
struct ksd_ef {
	UBYTE	Scan;		// 起動ScanCode
	UBYTE	Shift;		// 起動Shift状態
	int	(*Exec)();	// 起動プログラム
 struct ksd_ef	*Next;		// 次のテーブルアドレス
};
typedef struct ksd_ef KSD_EF;

// APIコマンド
#define	KSD_Clear	'C'	/* キーバッファークリア */
#define	KSD_Active	'A'	/* 活動状態にする */
#define	KSD_BuffActive	'B'	/* 外部プログラム起動無し活動状態にする */
#define	KSD_OnceActive	'O'	/* 一時活動状態にする */
#define	KSD_Pause	'P'	/* 休止状態にする */
#define	KSD_Stop	'S'	/* 完全停止状態にする */
#define	KSD_WFMusi	'E'	/* 書き込みFull時に書き込めない部分は無視する */
#define	KSD_WFFull	'F'	/* 書き込みFull時に古いデータを消して書き込む */
#define	KSD_CLEAR	KSD_Clear
#define	KSD_ACTIVE	KSD_Active
#define	KSD_PAUSE	KSD_Pause
//
#define	KSD_CheckFull	1	/* バッファーフルチェック */
#define	KSD_CheckEmpty	2	/* バッファー空チェック */
#define	KSD_Rcheck	3	/* 先行読みだし */
#define	KSD_Read	4	/* 読みだし */
#define	KSD_Write	5	/* 書き込み */
#define	KSD_ReadMode	6	/* 内部状態読みだし */
#define	KSD_ReadVer	7	/* バージョン読みだし */
#define	KSD_ReadSize	8	/* バッファーサイズ読みだし */
#define	KSD_ReadFree	9	/* バッファーフリーサイズ読みだし */
#define	KSD_LinkEFunc	10	/* 外部起動プログラム登録 */
#define	KSD_UnlinkEFunc	11	/* 外部起動プログラム登録解除 */
#define	KSD_JLock	12	/* 常駐ロック */
#define	KSD_JUnlock	13	/* 常駐アンロック */
#define	KSD_Read1	14	/* 1byte読みだし */
#define	KSD_Write1	15	/* 1byte書き込み */
#define	KSD_B_KEYINP	16	/* B_KEYINP */
#define	KSD_B_KEYSNS	17	/* B_KEYSNS */
#define	KSD_B_SFTSNS	18	/* B_SFTSNS */
#define	KSD_ExecEFunc	19	/* 外部起動プログラム強制起動 */
#define	KSD_DevNameA	20	/* デバイス名取得 (v1.7) */

// 状態:コマンド名と同じ（ただし、すべてのコマンドに対応する状態があるわけではない）
#define	KSD_ST_Active		KSD_Active	/* 活動状態 */
#define	KSD_ST_BuffActive	KSD_BuffActive	/* 外部プログラム起動無し活動状態 */
#define	KSD_ST_OnceActive	KSD_OnceActive	/* 一時活動状態 */
#define	KSD_ST_Pause		KSD_Pause	/* 休止状態 */
#define	KSD_ST_Stop		KSD_Stop	/* 完全停止状態 */
#define	KSD_ST_WFMusi		KSD_WFMusi	/* 書き込みFull時に書き込めない部分は無視する */
#define	KSD_ST_WFFull		KSD_WFFull	/* 書き込みFull時に古いデータを消して書き込む */
#define	KSD_ST_ACTIVE		KSD_ST_Active
#define	KSD_ST_PAUSE		KSD_ST_Pause

// コマンド名（文字列）for KSDSetStatus() : V1.5から変更になっているので注意!!
#define	KSD_Clear_S		"C"	/* キーバッファークリア */
#define	KSD_Active_S		"A"	/* 活動状態にする */
#define	KSD_BuffActive_S	"B"	/* 外部プログラム起動無し活動状態にする */
#define	KSD_OnceActive_S	"O"	/* 一時活動状態にする */
#define	KSD_Pause_S		"P"	/* 休止状態にする */
#define	KSD_Stop_S		"S"	/* 完全停止状態にする */
#define	KSD_WFMusi_S		"E"	/* 書き込みFull時に書き込めない部分は無視する */
#define	KSD_WFFull_S		"F"	/* 書き込みFull時に古いデータを消して書き込む */
#define	KSD_CLEAR_S	KSD_Clear_S
#define	KSD_ACTIVE_S	KSD_Active_S
#define	KSD_PAUSE_S	KSD_Pause_S

/* KSD関数はプロトタイプ宣言のみ用意 */
#ifdef	__cplusplus	/* G++対応 */
extern	"C" {
#endif
	int	KSDCheck(void);
	int	KSDSetStatus(char *);
	int	KSDReadStatus(char *);
	int	KSDSetData(UBYTE *);
	void	KSDDevName(UBYTE *);	// V1.7
	// API関数(V1.5)
	int	KSDSetAPI(void);
	long	KSDCallAPI(UBYTE);
	long	KSDCallAPI1d(UBYTE,long);
	long	KSDCallAPI1a(UBYTE,void *);
	long	KSDCallAPI2(UBYTE,void *,long);
	//
	long	KSDRead(UBYTE *,int );
	long	KSDWrite(UBYTE *,int );
	int	KSDLinkEFunc(KSD_EF *);
	int	KSDUnlinkEFunc(KSD_EF *);
	void	KSDClear(void);
	void	KSDPause(void);
	void	KSDStop(void);
	void	KSDActive(void);
	void	KSDOnceActive(void);
	void	KSDBuffActive(void);
	void	KSDWFMusi(void);
	void	KSDWFFull(void);
	int	KSDCheckFull(void);
	int	KSDCheckEmpty(void);
	int	KSDRcheck(void);
	ULONG	KSDReadMode(void);
	int	KSDReadVer(void);
	long	KSDReadSize(void);
	long	KSDReadFree(void);
	int	KSDJLock(void);
	int	KSDJUnlock(void);
	int	KSDRead1(void);
	int	KSDWrite1(UBYTE);
	int	KSDB_KEYINP(void);
	int	KSDB_KEYSNS(void);
	int	KSDB_SFTSNS(void);
	int	KSDExecEFunc(KSD_EF *);
	void	KSDDevNameA(UBYTE *);	// V1.7
#ifdef	__cplusplus
}
#endif

// #define定義関数
#define	KSDClear()	KSDCallAPI(KSD_Clear)
#define	KSDPause()	KSDCallAPI(KSD_Pause)
#define	KSDStop()	KSDCallAPI(KSD_Stop)
#define	KSDActive()	KSDCallAPI(KSD_Active)
#define	KSDBuffActive()	KSDCallAPI(KSD_BuffActive)
#define	KSDOnceActive()	KSDCallAPI(KSD_OnceActive)
#define	KSDWFMusi()	KSDCallAPI(KSD_WFMusi)
#define	KSDWFFull()	KSDCallAPI(KSD_WFFull)
#define	KSDCheckFull()	KSDCallAPI(KSD_CheckFull)
#define	KSDCheckEmpty()	KSDCallAPI(KSD_CheckEmpty)
#define	KSDRcheck()	KSDCallAPI(KSD_Rcheck)
#define	KSDReadMode()	KSDCallAPI(KSD_ReadMode)
#define	KSDReadVer()	KSDCallAPI(KSD_ReadVer)
#define	KSDReadSize()	KSDCallAPI(KSD_ReadSize)
#define	KSDReadFree()	KSDCallAPI(KSD_ReadFree)
#define	KSDJLock()	KSDCallAPI(KSD_JLock)
#define	KSDJUnlock()	KSDCallAPI(KSD_JUnlock)
#define	KSDB_KEYINP()	KSDCallAPI(KSD_B_KEYINP)
#define	KSDB_KEYSNS()	KSDCallAPI(KSD_B_KEYSNS)
#define	KSDB_SFTSNS()	KSDCallAPI(KSD_B_SFTSNS)
//
#define	KSDRead1()		KSDCallAPI(KSD_Read1)
#define	KSDWrite1(dt)		KSDCallAPI1d(KSD_Write1,dt)
#define	KSDLinkEFunc(ef)	KSDCallAPI1a(KSD_LinkEFunc,ef)
#define	KSDUnlinkEFunc(ef)	KSDCallAPI1a(KSD_UnlinkEFunc,ef)
#define	KSDExecEFunc(ef)	KSDCallAPI1a(KSD_ExecEFunc,ef)
#define	KSDDevNameA(nm)		KSDCallAPI1a(KSD_DevNameA,nm)	// V1.7
#define	KSDRead(buff,size)	KSDCallAPI2(KSD_Read,buff,size)
#define	KSDWrite(buff,size)	KSDCallAPI2(KSD_Write,buff,size)

#endif
