TNB Library
TnbCeUsbHid.h
[詳解]
1#pragma once
11#ifndef _WIN32_WCE
12 #error TnbCeUsbHid.h is only supported on Windows CE platforms.
13#endif // _WIN32_WCE
14
15
16
17#include "TnbCommunication.h"
18#include "TnbRegistryAccessor.h"
19
20
21
22//TNB Library
23namespace TNB
24{
25
26
27
28#ifndef _TnbDOXYGEN //Document作成用シンボル
29
30#ifndef CTL_CODE
31 #define CTL_CODE( DeviceType, Function, Method, Access ) \
32 ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) )
33#endif
34
36#define IOCTL_USBHIDT_BASE 0xFC
37
38#endif
39
40
41
56{
57 DEFSUPER(ICommunication);
58public:
59
68 {
70 enum
71 {
72 CC = CTL_CODE(IOCTL_USBHIDT_BASE, 0x0F00, 0, 1/*Read*/),
73 SIGNATURE = 'ThiD'
74 };
75 DWORD signature;
76 DWORD version;
79 };
80
89 {
91 enum
92 {
93 CC = CTL_CODE(IOCTL_USBHIDT_BASE, 0x0F01, 0, 1/*Read*/)
94 };
95 DWORD type;
96 DWORD index;
97 LPWSTR lpStringData;
100 };
101
110 {
112 enum
113 {
114 CC = CTL_CODE(IOCTL_USBHIDT_BASE, 0x0F10, 0, 1/*Read*/)
115 };
116 DWORD mode;
117 DWORD timeout;
118 LPVOID lpInputData;
121 };
122
131 {
133 enum
134 {
135 CC = CTL_CODE(IOCTL_USBHIDT_BASE, 0x0F20, 0, 2/*Write*/)
136 };
137 DWORD mode;
138 DWORD timeout;
141 };
142
147 {
152 };
153
154
155 //------------------------------------
156
157
159 explicit CCeUsbHid(void)
160 : m_handle(INVALID_HANDLE_VALUE), m_property(_T("HID"), TNBVIW_KIND_USB), m_recvTimeout(100), m_deviceIndex(1)
161 {
162 }
163
165 virtual ~CCeUsbHid(void)
166 {
167 Close();
168 }
169
176 void SetDeviceIndex(int i)
177 {
178 m_deviceIndex = i;
179 }
180
186 virtual const TProperty& GetProperty(void) const
187 {
188 return m_property;
189 }
190
196 virtual bool Open(void)
197 {
198 Close();
199 // デバイスのオープン
200 CStr s;
201 s.Format(_T("HID%d:"), m_deviceIndex);
202 HANDLE h = ::CreateFile(s, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);
203 if ( h == INVALID_HANDLE_VALUE )
204 {
205 if ( ::GetLastError() != ERROR_DEV_NOT_EXIST )
206 {
207 _GetLastError("CreateFile");
208 }
209 return false;
210 }
211 BOOL r = ::DeviceIoControl(h, m_info.CC, &m_info, sizeof(m_info), NULL, 0, NULL, NULL);
212 if ( r == 1 && m_info.signature == m_info.SIGNATURE )
213 {
214 TRACE1("CeUsbHid.CheckDevice, 結果 = %d\n", r);
215 TRACE1(" バージョン情報 = 0x%X\n", m_info.version);
216 TRACE1(" OUTPUTサイズ = 0x%X\n", m_info.outputReportLength);
217 TRACE1(" INPUTサイズ = 0x%X\n", m_info.inputReportLength);
218 //
219 m_handle = h;
220 m_property.typeName = _T("HID");
221 m_property.typeId = TNBVIW_KIND_USB + (reinterpret_cast<ULONG_PTR>(this) & 0xFFFF);
222 m_property.receivePacketSize = m_info.inputReportLength;
223 m_property.sendPacketSize = m_info.outputReportLength;
224 return true;
225 }
226 return false;
227 }
228
232 virtual void Close(void)
233 {
234 //Portのクローズ
235 if ( m_handle != INVALID_HANDLE_VALUE )
236 {
237 ::CloseHandle(m_handle);
238 m_handle = INVALID_HANDLE_VALUE;
239 }
240 }
241
247 virtual bool IsOpened(void) const
248 {
249 return m_handle != INVALID_HANDLE_VALUE;
250 }
251
257 virtual bool IsConnect(void) const
258 {
259 return IsOpened();
260 }
261
267 virtual bool CanSend(void) const
268 {
269 return IsOpened() && (m_info.outputReportLength > 0);
270 }
271
277 virtual bool CanReceive(void) const
278 {
279 return IsOpened() && (m_info.inputReportLength > 0);
280 }
281
288 bool SetReceiveTimeout(DWORD to)
289 {
290 m_recvTimeout = to;
291 return true;
292 }
293
302 virtual size_t Send(size_t size, LPCVOID P)
303 {
304 if ( ! CanSend() )
305 {
306 return INVALID_SIZE;
307 }
309 cb.mode = 0;
310 cb.timeout = 300;
311 cb.outputDataSize = size;
312 cb.lpcOutputData = P;
313 BOOL r = ::DeviceIoControl(m_handle, cb.CC, &cb, sizeof(cb), NULL, 0, NULL, NULL);
314 if ( ! r )
315 {
316 m_ConnectCheck();
317 }
318 return r ? size : INVALID_SIZE;
319 }
320
329 virtual size_t Receive(size_t size, LPVOID _P)
330 {
331 if ( ! CanReceive() )
332 {
333 return INVALID_SIZE;
334 }
336 cb.mode = 0;
337 cb.timeout = m_recvTimeout;
338 cb.inputDataBufferSize = size;
339 cb.lpInputData = _P;
340 BOOL r = ::DeviceIoControl(m_handle, cb.CC, &cb, sizeof(cb), NULL, 0, NULL, NULL);
341 if ( ! r )
342 {
343 m_ConnectCheck();
344 }
345 return r ? cb.inputedDataSize : INVALID_SIZE;
346 }
347
353 virtual size_t GetReceivingDataSize(void) const
354 {
355 return INVALID_SIZE;
356 }
357
364 virtual EState Check(void) const
365 {
366 return IsConnect() ? CONNECTING : CLOSED;
367 }
368
373 virtual void Purge(void) {}
374
382 CStr GetString(EStringType type, INDEX index = 0) const
383 {
384 const int LEN = 1024;
385 CStr s;
387 cb.type = type;
388 cb.index = index;
389 cb.lpStringData = s.GetBuffer(LEN);
390 cb.stringDataBufferSize = LEN;
391 BOOL r = ::DeviceIoControl(m_handle, cb.CC, &cb, sizeof(cb), NULL, 0, NULL, NULL);
392 s.ReleaseBuffer();
393 if ( ! r )
394 {
395 s.Empty();
396 }
397 return s;
398 }
399
406 {
407 return m_info;
408 }
409
420 static bool RegistDriver(WORD vendorId = 0x20FC, WORD productId = 1, WORD usagePage = 0xFF00, WORD usageId = 1, LPCTSTR lpszDriverName = _T("USBHID_T.DLL"))
421 {
422 CStr s;
423 //---
424 s.Format(_T("\\Windows\\%s"), lpszDriverName);
425 ::SetLastError(0);
426 DWORD a = ::GetFileAttributes(s);
427 if ( _GetLastError("GetFileAttributes") == ERROR_FILE_NOT_FOUND )
428 {
429 return false;
430 }
431 //---
432 CRegistryAccessor reg(HKEY_LOCAL_MACHINE, _T("Drivers"));
433 //
434 s.Format(_T("USB\\LoadClients\\%d_%d\\Default\\3\\Hid_Class"), vendorId, productId);
435 CRegistryAccessor::CSection sec = reg[s];
436 sec.WriteString(_T("DLL"), lpszDriverName);
437 //
438 s.Format(_T("USB\\ClientDrivers\\Hid_t\\Hid_Class"));
439 sec = reg[s];
440 sec.WriteString(_T("DLL"), lpszDriverName);
441 sec.WriteString(_T("Prefix"), _T("HID"));
442 sec.WriteDword(_T("QueuedTransferCount"), 2);
443 //
444 s.Format(_T("USB\\ClientDrivers\\Hid_t\\Instance"));
445 sec = reg[s];
446 sec.WriteString(_T("DLL"), lpszDriverName);
447 //
448 s.Format(_T("HID\\LoadClients\\Default\\Default\\%d_%d\\PSL"), usagePage, usageId);
449 sec = reg[s];
450 sec.WriteString(_T("DLL"), lpszDriverName);
451 return true;
452 }
453
454private:
455 void m_ConnectCheck(void)
456 {
457 switch ( ::GetLastError() )
458 {
459 case 0x649:
460 case ERROR_NOT_SUPPORTED:
461 Close();
462 break;
463 default:
464 break;
465 }
466 }
467 int m_deviceIndex;
468 TIoCtrlBlock_CheckDevice m_info;
469 HANDLE m_handle;
470 TProperty m_property;
471 DWORD m_recvTimeout;
472};
473
474
475
476}; //TNB
通信関係のヘッダ
レジストリアクセス関係のヘッダ
USB-HIDアクセスクラス(CE専用)
Definition: TnbCeUsbHid.h:56
virtual EState Check(void) const
[確認] チェック.
Definition: TnbCeUsbHid.h:364
static bool RegistDriver(WORD vendorId=0x20FC, WORD productId=1, WORD usagePage=0xFF00, WORD usageId=1, LPCTSTR lpszDriverName=_T("USBHID_T.DLL"))
[設定] ドライバーレジストリ登録.
Definition: TnbCeUsbHid.h:420
CStr GetString(EStringType type, INDEX index=0) const
[取得] 文字列取得.
Definition: TnbCeUsbHid.h:382
virtual bool Open(void)
[処理] オープン.
Definition: TnbCeUsbHid.h:196
virtual bool CanSend(void) const
[確認] 送信可能確認.
Definition: TnbCeUsbHid.h:267
virtual void Purge(void)
[処理] パージ.
Definition: TnbCeUsbHid.h:373
virtual bool IsConnect(void) const
[確認] 接続確認.
Definition: TnbCeUsbHid.h:257
virtual ~CCeUsbHid(void)
デストラクタ
Definition: TnbCeUsbHid.h:165
bool SetReceiveTimeout(DWORD to)
[設定] 受信タイムアウト時間設定.
Definition: TnbCeUsbHid.h:288
virtual void Close(void)
[処理] クローズ.
Definition: TnbCeUsbHid.h:232
CCeUsbHid(void)
コンストラクタ
Definition: TnbCeUsbHid.h:159
EStringType
文字タイプ
Definition: TnbCeUsbHid.h:147
@ MANUFACTURER
Manufacturer identifer.
Definition: TnbCeUsbHid.h:149
@ SERIALNUMBER
Serial number.
Definition: TnbCeUsbHid.h:151
@ PRODUCT
Product identifer.
Definition: TnbCeUsbHid.h:150
@ INDEXED
String Index.
Definition: TnbCeUsbHid.h:148
virtual bool CanReceive(void) const
[確認] 受信可能確認.
Definition: TnbCeUsbHid.h:277
void SetDeviceIndex(int i)
[設定] デバイスインデックス設定.
Definition: TnbCeUsbHid.h:176
virtual bool IsOpened(void) const
[確認] オープン確認.
Definition: TnbCeUsbHid.h:247
virtual size_t Receive(size_t size, LPVOID _P)
[処理] 受信.
Definition: TnbCeUsbHid.h:329
virtual const TProperty & GetProperty(void) const
[取得] 性能取得.
Definition: TnbCeUsbHid.h:186
virtual size_t GetReceivingDataSize(void) const
[確認] 受信データ確認.
Definition: TnbCeUsbHid.h:353
virtual size_t Send(size_t size, LPCVOID P)
[処理] 送信.
Definition: TnbCeUsbHid.h:302
const TIoCtrlBlock_CheckDevice & GetDeviceInfo(void) const
[取得] デバイス情報取得
Definition: TnbCeUsbHid.h:405
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
レジストリアクセスクラス
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
セクション情報アクセスクラス
Definition: TnbAccessor.h:294
bool WriteDword(LPCTSTR lpszKey, DWORD dwValue)
[追加] 数値情報記録
Definition: TnbAccessor.h:576
bool WriteString(LPCTSTR lpszKey, LPCTSTR lpszValue)
[追加] 文字列情報記録
Definition: TnbAccessor.h:495
TNB Library
Definition: TnbDoxyTitle.txt:2
DWORD inputReportLength
[out] INPUTサイズが格納される。
Definition: TnbCeUsbHid.h:78
@ CC
コントロールコード
Definition: TnbCeUsbHid.h:72
DWORD signature
[out] シグネチャ。SIGNATURE が格納されている。
Definition: TnbCeUsbHid.h:75
DWORD outputReportLength
[out] OUTPUTサイズが格納される。
Definition: TnbCeUsbHid.h:77
DWORD version
[out] バージョン情報が格納される。
Definition: TnbCeUsbHid.h:76
DWORD gotStringDataSize
[out] 取得文字長が格納される。
Definition: TnbCeUsbHid.h:99
DWORD stringDataBufferSize
[in] 文字データ長を指定する。
Definition: TnbCeUsbHid.h:98
@ CC
コントロールコード
Definition: TnbCeUsbHid.h:93
DWORD index
[in] Only used with stringType == HID_STRING_INDEXED
Definition: TnbCeUsbHid.h:96
LPWSTR lpStringData
[in,out] 取得文字データが格納されるバッファアドレスを指定する。
Definition: TnbCeUsbHid.h:97
DWORD type
[in] 文字タイプ CUsbHid::EStringType
Definition: TnbCeUsbHid.h:95
DWORD timeout
[in] タイムアウト時間(ms)を指定する
Definition: TnbCeUsbHid.h:117
DWORD inputDataBufferSize
[in] 受信可能データサイズを指定する。
Definition: TnbCeUsbHid.h:119
DWORD inputedDataSize
[out] 受信データサイズが格納される。
Definition: TnbCeUsbHid.h:120
LPVOID lpInputData
[in,out] 受信データが格納されるバッファアドレスを指定する。
Definition: TnbCeUsbHid.h:118
@ CC
コントロールコード
Definition: TnbCeUsbHid.h:114
DWORD mode
[in] 0;interrupt
Definition: TnbCeUsbHid.h:116
DWORD timeout
[in] タイムアウト時間(ms)を指定する
Definition: TnbCeUsbHid.h:138
LPCVOID lpcOutputData
[in] 送信データのアドレスを指定する。
Definition: TnbCeUsbHid.h:139
DWORD outputDataSize
[in] 送信データサイズを指定する。
Definition: TnbCeUsbHid.h:140
@ CC
コントロールコード
Definition: TnbCeUsbHid.h:135
DWORD mode
[in] 0;interrupt
Definition: TnbCeUsbHid.h:137
性能プロパティ型.
size_t sendPacketSize
送信パケットサイズ。INVALID_SIZE なら制限なし。
size_t receivePacketSize
受信パケットサイズ。INVALID_SIZE なら制限なし。
通信インターフェース
@ CONNECTING
オープン&接続状態
@ CLOSED
クローズ状態