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