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