1 /*---------------------------------------------------------------------------*
2   Project:  Host I/O Interface for HIO2
3   File:     Hio2IfHost.h
4 
5   (C)2005 HUDSON SOFT
6 
7   $Header: /home/cvsroot/SDK/build/demos/hio2demo/vc++/HioIf/include/Hio2IfHost.h,v 1.4 2007/11/26 13:55:39 iwai_yuma Exp $
8 
9   $NoKeywords: $
10  *---------------------------------------------------------------------------*/
11 
12 // HIO2 API wrapper interface
13 
14 #pragma	once
15 #pragma warning(disable: 4311)
16 #pragma warning(disable: 4312)
17 
18 #include <revolution/hio2.h>
19 #include <win32/mytl.h>	// NNGC SDK : $(ROOT)/include/win32
20 #include "Hio2If.h"		// ../../HioIf/include
21 #include "Hio2DllIf.h"
22 
23 ///////////////////////////////////////////////////////////////////////////////
24 //
25 // Use for CHio2If internal processing (private)
26 //
27 
28 #define	HIO2IF_INVALID_HANDLE_VALUE	((LPVOID)-1)
29 
30 // Host I/O interface state
31 typedef struct _HIO2IF_STATUS
32 {
_HIO2IF_STATUS_HIO2IF_STATUS33 	_HIO2IF_STATUS()
34 	{
35 		m_nPcChan = HIO2IF_INVALID_ID;
36 		m_nDevType = HIO2_DEVICE_INVALID;
37 		m_hHIO	= HIO2IF_INVALID_HANDLE_VALUE;
38 		m_nMode	= HIO2IF_MODE_NONE;
39 		m_bConnect	= FALSE;
40 		m_bReceived	= FALSE;
41 		m_bSendPossible = TRUE;
42 		m_dwAsyncMode = 0;
43 		m_fncCallback = NULL;
44 #ifndef	HW0
45 		m_pPathName = NULL;
46 #else	// HW0
47 		m_pPathName = -1;
48 #endif	// HW0
49 	}
50 
~_HIO2IF_STATUS_HIO2IF_STATUS51 	~_HIO2IF_STATUS()
52 	{
53 #ifndef	HW0
54 		if ( m_pPathName != NULL ) delete [] m_pPathName;
55 #endif	// HW0
56 	}
57 
58 	HIO2DevicePath	m_pPathName;		// Device path name
59 	int				m_nPcChan;			// PC channel (pseudo-created by CHio2If)
60 	HIO2DeviceType	m_nDevType;			// EXI device type
61 	LPVOID			m_hHIO;				// Host I/O API handle
62 	HIO2IF_MODE		m_nMode;			// Open mode
63 	volatile BOOL	m_bConnect;			// NNGC connection state
64 	volatile BOOL	m_bReceived;		// Data receipt notification from NNGC
65 	volatile BOOL	m_bSendPossible;	// Sending to NNGC possible
66 	volatile DWORD	m_dwAsyncMode;		// Async mode
67 	HIO2IF_EVENT_CALLBACK	m_fncCallback;	// Callback function when event is received
68 } HIO2IF_STATUS, *LPHIO2IF_STATUS;
69 
70 // Host I/O interface state listing and comparison function
71 //
72 // * The index for this class is HIO2IF_ID gotten by CHio2If->Open()
73 //
74 
75 typedef TMYList<LPHIO2IF_STATUS>	CStatusList;
76 
77 // The comparison function specified in CtatusList.IndexOf()
78 BOOL	Hio2IfCompHandle(LPHIO2IF_STATUS pItem, LPVOID pData);
79 BOOL	Hio2IfCompPcChan(LPHIO2IF_STATUS pItem, LPVOID pData);
80 
81 ///////////////////////////////////////////////////////////////////////////////
82 //
83 // CHio2If
84 //
85 
86 // Host I/O interface for PC
87 
88 class CHio2If
89 {
90 public:
91 	CHio2If();
92 	~CHio2If();
93 
94 	// Device path information referencing method
GetDeviceCount()95 	int	GetDeviceCount()	const { return (int)m_cDevices.size();	}
GetDevicePath(int nIndex)96 	HIO2DevicePath	GetDevicePath(int nIndex)	const
97 	{
98 		ASSERT((nIndex >= 0) && (nIndex < (int)m_cDevices.size()));
99 		return m_cDevices[nIndex];
100 	}
101 
102 	// HIO2 API control method
103 	HIO2IF_RESULT	Init();
104 	HIO2IF_RESULT	Open(HIO2DevicePath pathName, HIO2IF_EVENT_CALLBACK callback, HIO2IF_ID& id);
105 	HIO2IF_RESULT	Read(HIO2IF_ID id, DWORD addr, LPVOID buffer, int size, BOOL async);
106 	HIO2IF_RESULT	ReadFree(HIO2IF_ID id, DWORD addr, LPVOID buffer, int size, BOOL async);
107 	HIO2IF_RESULT	Write(HIO2IF_ID id, DWORD addr, LPVOID buffer, int size, BOOL async);
108 	HIO2IF_RESULT	WriteFree(HIO2IF_ID id, DWORD addr, LPVOID buffer, int size, BOOL async);
109 	HIO2IF_RESULT	ReadStatus(HIO2IF_ID id, DWORD& status);
110 	HIO2IF_RESULT	Close(HIO2IF_ID id);
111 	void			Exit();
112 
113 	// State referencing method
IsConnected(HIO2IF_ID id)114 	BOOL	IsConnected(HIO2IF_ID id)
115 	{
116 		return IsValidID(id) ? m_cHioStatus[id]->m_bConnect : FALSE;
117 	}
IsReceived(HIO2IF_ID id)118 	BOOL	IsReceived(HIO2IF_ID id)
119 	{
120 		return IsValidID(id) ? m_cHioStatus[id]->m_bReceived : FALSE;
121 	}
IsSendPossible(HIO2IF_ID id)122 	BOOL	IsSendPossible(HIO2IF_ID id)
123 	{
124 		return IsValidID(id) ? m_cHioStatus[id]->m_bSendPossible : FALSE;
125 	}
GetOpenMode(HIO2IF_ID id)126 	HIO2IF_MODE	GetOpenMode(HIO2IF_ID id)
127 	{
128 		return IsValidID(id) ? m_cHioStatus[id]->m_nMode : HIO2IF_MODE_NONE;
129 	}
GetPcChan(HIO2IF_ID id)130 	int	GetPcChan(HIO2IF_ID id)
131 	{
132 		return IsValidID(id) ? m_cHioStatus[id]->m_nPcChan : HIO2IF_INVALID_ID;
133 	}
GetDeviceType(HIO2IF_ID id)134 	HIO2DeviceType	GetDeviceType(HIO2IF_ID id)
135 	{
136 		return IsValidID(id) ? m_cHioStatus[id]->m_nDevType : HIO2_DEVICE_INVALID;
137 	}
138 
139 	// Method for multi-threaded application
EnterCriticalSection()140 	void	EnterCriticalSection()	{ ::EnterCriticalSection(&m_csCriticalSection); }
LeaveCriticalSection()141 	void	LeaveCriticalSection()	{ ::LeaveCriticalSection(&m_csCriticalSection); }
142 
143 	// Method for getting error information
GetLastError()144 	HIO2IF_ERROR	GetLastError()	const { return m_nLastError;	}
GetMessage()145 	LPCSTR	GetMessage()			const { return m_szMessage;		}
146 
147 	//!!!!!!!!!! Method whose use is forbidden in applications!!!!!
148 
GetDllIf()149 	CHio2DllIf&	GetDllIf()	{ return m_cHio2Dll;	};
SetDeviceType(HIO2IF_ID id,HIO2DeviceType type)150 	void	SetDeviceType(HIO2IF_ID id, HIO2DeviceType type)
151 	{
152 		if ( IsValidID(id) ) m_cHioStatus[id]->m_nDevType = type;
153 	};
SetOpenMode(HIO2IF_ID id,HIO2IF_MODE mode)154 	void	SetOpenMode(HIO2IF_ID id, HIO2IF_MODE mode)
155 	{
156 		if ( IsValidID(id) ) m_cHioStatus[id]->m_nMode = mode;
157 	};
SetConnect(HIO2IF_ID id,BOOL bStatus)158 	void	SetConnect(HIO2IF_ID id, BOOL bStatus)
159 	{
160 		if ( IsValidID(id) ) m_cHioStatus[id]->m_bConnect = bStatus;
161 	};
SetReceived(HIO2IF_ID id,BOOL bStatus)162 	void	SetReceived(HIO2IF_ID id, BOOL bStatus)
163 	{
164 		if ( IsValidID(id) ) m_cHioStatus[id]->m_bReceived = bStatus;
165 	};
SetSendPossible(HIO2IF_ID id,BOOL bStatus)166 	void	SetSendPossible(HIO2IF_ID id, BOOL bStatus)
167 	{
168 		if ( IsValidID(id) ) m_cHioStatus[id]->m_bSendPossible = bStatus;
169 	};
GetAsyncMode(HIO2IF_ID id)170 	DWORD	GetAsyncMode(HIO2IF_ID id)
171 	{
172 		return IsValidID(id) ? m_cHioStatus[id]->m_dwAsyncMode : 0;
173 	};
SetAsyncMode(HIO2IF_ID id,DWORD mode)174 	void	SetAsyncMode(HIO2IF_ID id, DWORD mode)
175 	{
176 		if ( IsValidID(id) ) m_cHioStatus[id]->m_dwAsyncMode = mode;
177 	}
CallEventCallback(HIO2IF_ID id,HIO2IF_EVENT event)178 	void	CallEventCallback(HIO2IF_ID id, HIO2IF_EVENT event)
179 	{
180 		if ( (IsValidID(id)) && (m_cHioStatus[id]->m_fncCallback != NULL) )
181 			m_cHioStatus[id]->m_fncCallback(id, event);
182 	}
GetIdOfHandle(LPVOID h)183 	int	GetIdOfHandle(LPVOID h)
184 	{
185 		return m_cHioStatus.IndexOf(h,Hio2IfCompHandle);
186 	}
187 	void	AddDevicePath(HIO2DevicePath pathName);
188 
189 protected:
190 	BOOL	m_bInitialized;					// Initialization determining flag
191 
192 	deque<HIO2DevicePath>	m_cDevices;		// Device path information
193 	CStatusList	m_cHioStatus;				// Status information
194 
195 	HIO2IF_ERROR	m_nLastError;			// Error Codes
196 	TCHAR	m_szMessage[128];				// Error messages
197 
198 	CRITICAL_SECTION	m_csCriticalSection;	// For multi-threaded applications
199 
200 	CHio2DllIf	m_cHio2Dll;	// hio2[D].dll interface
201 
202 	static LPCSTR	m_lpszErrorStrings[HIO2IF_ERROR_MAX];	// Error messages
203 
204 	void	InitInstance();
205 
IsValidID(HIO2IF_ID id)206 	BOOL	IsValidID(HIO2IF_ID id)
207 	{
208 		return ((id >= 0) && (id < m_cHioStatus.GetCount())) ? TRUE : FALSE;
209 	};
210 
211 	// (Fatal) Error message settings
212 	HIO2IF_RESULT	SetFatal(HIO2IF_ERROR errID, ...);
213 	HIO2IF_RESULT	SetError(HIO2IF_ERROR errID, ...);
214 };
215 
216 //-----------------------------------------------------------------------------
217 // Function prototypes
218 
219 // Create Host I/O interface for PC
220 CHio2If*	Hio2CreateInterface(void);
221 
222 // Release Host I/O interface for PC
223 void	Hio2ReleaseInterface(CHio2If* pHioIf);
224 
225 // End of Hio2IfHost.h
226