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