ํ๋ฅญํ ๋์๊ด Mike, ์ด ์์ฒญ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ฌธ์ ๋ InputReport๋ฅผ ๋ฐ์ดํฐ๋ก ์ฑ์ฐ๊ณ ์ถ์ ๋์ ๋๋ค.
InputReport = device.ReadReport();
์ฌ๊ธฐ์ InputReport๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
HidLibrary.HidReport InputReport = ์๋ก์ด HidLibrary.HidReport(device.Capabilities.InputReportByteLength);
ํนํ ์ฅ์น์์ ๋น๋๊ธฐ ๋ชจ๋๋ก ๋ณด๊ณ ์๋ฅผ ์ฝ์ ๋(์: 1์ด์ 100๋ฒ) ๋์ถ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋งค์ฐ ํฝ๋๋ค. ๋ช ๋ถ ์์ ์๋ฐฑ ๋ฉ๊ฐ๋ฐ์ดํธ๊ฐ ์์๋ ์ ์์ต๋๋ค.
์ ๋ C# ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ณด์์ด๋ฉฐ ์์์ ์ค๋ช ํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค ;(
์ธ์ฌ๋ง!
์นด์ฐจ๋ฅดํธ,
๋ถํํ๋ ๊ทธ ์ฝ๋๋ ๊ฝค ์ค๋๋์๊ณ ๊ทธ๊ฒ์ ์ค ์๊ฐ์ด ์์์ต๋๋ค
๋ชจ๋ TLC. ์ด ์์ ์์ ๋๋ ๋จ์ง ๊ทธ๊ฒ์ ์ฐธ์กฐ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ต์
๋ด๊ธฐ๋ ํฌํฌ/๊ฐ์ ํ๋ ๊ฒ์
๋๋ค.
๋ฏธ๋์
2011๋
8์ 14์ผ ์ผ์์ผ ์ค์ 10:37 kaczart <
๋ต์ฅ@reply.github.com>์์ฑ:
ํ๋ฅญํ ๋์๊ด Mike, ์ด ์์ฒญ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ฌธ์ ๋ InputReport๋ฅผ ๋ฐ์ดํฐ๋ก ์ฑ์ฐ๊ณ ์ถ์ ๋์ ๋๋ค.
InputReport = device.ReadReport();
์ฌ๊ธฐ์ InputReport๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
HidLibrary.HidReport InputReport = ์ ๊ท
HidLibrary.HidReport(ukp.Capabilities.InputReportByteLength);ํนํ ๋ณด๊ณ ์๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ์ฝ์ ๋ ๋์ถ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋งค์ฐ ํฝ๋๋ค.
์ฅ์น์์ ๋ชจ๋(์: 1์ด์ 100ํ). ๋ช ๋ถ ์์ ํ ์ ์์ต๋๋ค
์๋ฐฑ ๋ฉ๊ฐ ๋ฐ์ดํธ๊ฐ ๊ฑธ๋ฆฝ๋๋ค.์ ๋ C# ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ณด์์ด๋ฉฐ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
์์ ์ค๋ช ;(์ธ์ฌ๋ง!
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/mikeobrien/HidLibrary/issues/11
์นด์ฐจ๋ฅดํธ,
ํด๊ฒฐ์ฑ
์ ์ฐพ์ผ์
จ์ต๋๊น? ๋๋ ๋จ์ง ๊ฐ์ ๊ฒ์ ๋์น ์ฑ๋ค.
ํ๋ฅญํ ๋์๊ด Mike, ์ ๋ง ๊ฐ์ฌํฉ๋๋ค! ์ ๋ Endicia USB ์ค์ผ์ผ๋ก ์์
ํ๊ณ ์๋๋ฐ ์ด๊ฒ์ ๊ฝค ์ฌ๋ฏธ์์ต๋๋ค.
jrockfl,
๋ถํํ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๊ฐ๊ณผ ๊ธฐ์ ์ด ์์์ต๋๋ค.
์ธ์ฌ๋ง
๋ฌธ์ ๋ HidReport ๋ฐ Devicedata๊ฐ ํด์ ๋์ง ์์ ๊ฐ๋น์ง ์์ง์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์
๋๋ค.
์ฒ๋ฆฌ ํ ํด์ ํ๋ ๊ฒ์ ์ฌ์ด ์์ ์ด์ง๋ง ...
๋ง์ง๋ง์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ์ผ๋ฉฐ ์ฐพ์ ๋ด์ฉ์ ๊ณต์ ํฉ๋๋ค.
1) ์ฐ์ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ Read/Write ๋ฉ์๋๋ ์ฅ์น๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํฉ๋๋ค. IsConnected ๋ฉ์๋๊ฐ EnumerateHidDevices()๋ฅผ ํธ์ถํ ๋๋ง๋ค ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋ง์ด ์๋ชจ๋ฉ๋๋ค. ์ค์ ๋ก ์ฅ์น์์ ๋์ฉ๋ ๋ฐ์ดํฐ ํจํค์ง๋ฅผ ๋ณด๋ผ ๋ PC ํธ์คํธ๋ HID ์ฅ์น๋ณด๋ค ๋๋ฆฌ๊ณ ์ ํ๋ ๋ง ๋ฒํผ(๊ธฐ๋ณธ์ ์ผ๋ก 32๊ฐ ๋ณด๊ณ ์, 512๊ฐ๋ก ํ์ฅ๋ ์ ์์ง๋ง ์ต์ข
์๋ฃจ์
์ ์๋)๋ก ์ธํด ์ผ๋ถ ํจํท์ด ์์ค๋ฉ๋๋ค.
์ถ์ . ๋ค์์ ํธ์ถํ์ฌ ๋ง ๋ฒํผ๋ฅผ 32๊ฐ์์ ์ต๋ 512๊ฐ ๋ณด๊ณ ์๋ก ํ์ฅํ ์ ์์ต๋๋ค.
NativeMethods .HidD_SetNumInputBuffers((int)device.ReadHandle, 512); // XP ์ด์์์ ์๋ํฉ๋๋ค.
2) ๋ ๋ฒ์งธ๋ก EnumerateHidDevices()์์ "yield return devicePath"๋ก ์ธํด ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค. 69ํ ๋ฐ NativeMethods.SetupDiDestroyDeviceInfoList(deviceInfoSet); ์ ๋ ํธ์ถ๋์ง ์์ต๋๋ค.
๋ด ์๋ฃจ์
:
1) ์ฝ๊ธฐ/์ฐ๊ธฐ๋ง๋ค IsConnected๋ฅผ ํธ์ถํ์ง ๋ง์ญ์์ค. HidDevice์์ ์ถ๊ฐ isConnected ๋ณ์๋ฅผ ๋ง๋ญ๋๋ค.
public bool isConnected;
์ฐ๊ฒฐ์ด ์ฑ๊ณตํ ํ ๋ณ์๋ฅผ true๋ก ์ค์ ํฉ๋๋ค(์: Connect() ํจ์์์):
device.isConnected = true;
๋ชจ๋ DeviceEventMonitorInserted() ๋ฐ DeviceEventMonitorRemoved() ์ด๋ฒคํธ์์ ์
๋ฐ์ดํธํ์ญ์์ค. ์:
if (์ฝ์
!= null ) Inserted();
๋ค์์ผ๋ก ๋์ฒด:
if (์ฝ์
!= null )
{
isConnected = ์ฐธ;
์ฝ์
();
}
๊ทธ๋ฆฌ๊ณ :
if (์ ๊ฑฐ๋จ != null ) Removed();
๋ค์์ผ๋ก ๋์ฒด:
if (์ ๊ฑฐ != null )
{
isConnected = ๊ฑฐ์ง ;
์ ๊ฑฐ๋จ();
}
๋ชจ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ํธ์ถ ๊ธฐ๋ฅ์์ ์ด ๋ณ์๋ฅผ ํ์ธํ๋ ๊ฒ๋ณด๋ค:
if(IsConnected) ๋์ if(isConnected)
์ฅ์น๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํด์ผ ํ ๋๋ง๋ค ๊ณต์ฉ ๋ณ์ isConnected์ ์ํ๋ฅผ ํ์ธํ์ญ์์ค. ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค - ์ฝ๊ธฐ ์ค๋ ๋์ ๊ฒฝ์ฐ 10-20% ๋์ 0-1% ํ๋ก์ธ์ ์ฌ์ฉ.
2) HidDevice.cs ์ค #69์์ ๋ค์์ ์ญ์ ํฉ๋๋ค.
// ๋ฐํ devicePath๋ฅผ ๋ฐํํฉ๋๋ค.
NativeMethods .SetupDiDestroyDeviceInfoList(deviceInfoSet); ์ ์ ํ๊ฒ ํธ์ถ๋ฉ๋๋ค.
๋ค์์ผ๋ก NativeMethods .SetupDiDestroyDeviceInfoList(deviceInfoSet) ๋ค์์ ๋ค์์ ์ถ๊ฐํฉ๋๋ค.
foreach(์ฅ์น์ ๋ฌธ์์ด devicePath)
๋ฐํ ์ฅ์น ๊ฒฝ๋ก๋ฅผ ๋ฐํํฉ๋๋ค.
์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ ๋ฉ๋๋ค(์ ๊ฒฝ์ฐ์๋ ์์ ๋ฐ์ดํฐ 1MB๋น ์ฝ 256MB).
๋ฐ๋๋๋ค.
๊ต์ฅํฉ๋๋ค, ํํธ๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค, kaczart!!!
๋ค์์ kaczart(๊ทธ๋ฆฌ๊ณ ๋)๊ฐ ๋ฐ๊ฒฌํ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค.
https://github.com/macaba/HidLibrary/commit/8f1864e1351ccca4772d5bbc18a0f94d7ba07fe7
์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
device.ConnectionCheckOverride = device.IsConnected;
methodRequiringFasterUSBReadWrite();
device.ConnectionCheckOverride = false;
์ด๋ก ์ธํด ๋๋ USB ์ ์ก ํ ์คํธ ์ผ์ด์ค ์คํ ์๊ฐ์ด 159์ด์์ 47์ด๋ก ๋จ์ถ๋์์ต๋๋ค.
IsConnected ์์ฑ์ด HidDeviceEventMonitor์์ ์ฌ์ฉ๋๋ฏ๋ก ํ์ฌ ์ฐ๊ฒฐ๋ USB ์ฅ์น๋ฅผ ์ด๊ฑฐํ๋ ์๋ ๊ธฐ๋ฅ์ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ kaczart์ ์๋ฃจ์ ์ ๊ด์ฌ์ด ์์์ต๋๋ค. ๊ฐ๋จํ ๋งํด์; ๋๋ Inserted ๋ฐ Removed ์ด๋ฒคํธ๊ฐ kaczart์ ์ฝ๋์์ ํธ์ถ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(๊ฐ๋จํ ์ดํด๋ณด๊ธฐ์์).
๋ชจ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์์ ์ฅ์น ์ฐ๊ฒฐ์ ํ์ธํ๋ ๊ฒ์ ๊ณ ์ฃผํ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฃผ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋๋ค. ์ ๊ฒฝ์ฐ์๋ ์ฅ์น ์ฐ๊ฒฐ์ ๋ค์ ํ์ธํ๋ ๊ฒ๋ณด๋ค ์ฅ์น๊ฐ ์ฐ๊ฒฐ๋์๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด 30๋ฐฐ ๋ ๋นจ๋์ต๋๋ค. ์๋ณต ์๊ฐ์ ์ฝ 70ms์์ 2ms๋ก ๋จ์ด์ก์ต๋๋ค.
๊ทธ๋์ ๋น ๋ฅธ ํ๋ง ์ฌ์ฉ์ ์ํด ๋ด ์์ ์ IO๋ฅผ ์ฒ๋ฆฌํ๋ ๋ช ๊ฐ์ง ํ์ฅ ๋ฉ์๋๋ฅผ ์์ฑํ์ต๋๋ค.
[DllImport("hid.dll", SetLastError = true)]
static internal extern bool HidD_SetOutputReport(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength);
[DllImport("kernel32.dll", SetLastError = true)]
static internal extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
public static bool FastWrite(this HidLibrary.HidDevice device, byte[] outputBuffer)
{
try
{
if (NativeMethods.HidD_SetOutputReport(device.Handle, outputBuffer, outputBuffer.Length))
return true;
else
return false;
}
catch
{
return false;
}
}
public static ReadStatus FastRead(this HidLibrary.HidDevice device, byte[] inputBuffer)
{
try
{
uint bytesRead;
if (NativeMethods.ReadFile(device.Handle, inputBuffer, (uint)inputBuffer.Length, out bytesRead, IntPtr.Zero))
{
return ReadStatus.Success;
}
else
{
return ReadStatus.NoDataRead;
}
}
catch (Exception)
{
return ReadStatus.ReadError;
}
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ kaczart(๊ทธ๋ฆฌ๊ณ ๋)๊ฐ ๋ฐ๊ฒฌํ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
https://github.com/macaba/HidLibrary/commit/8f1864e1351ccca4772d5bbc18a0f94d7ba07fe7
์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ก ์ธํด ๋๋ USB ์ ์ก ํ ์คํธ ์ผ์ด์ค ์คํ ์๊ฐ์ด 159์ด์์ 47์ด๋ก ๋จ์ถ๋์์ต๋๋ค.
IsConnected ์์ฑ์ด HidDeviceEventMonitor์์ ์ฌ์ฉ๋๋ฏ๋ก ํ์ฌ ์ฐ๊ฒฐ๋ USB ์ฅ์น๋ฅผ ์ด๊ฑฐํ๋ ์๋ ๊ธฐ๋ฅ์ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ kaczart์ ์๋ฃจ์ ์ ๊ด์ฌ์ด ์์์ต๋๋ค. ๊ฐ๋จํ ๋งํด์; ๋๋ Inserted ๋ฐ Removed ์ด๋ฒคํธ๊ฐ kaczart์ ์ฝ๋์์ ํธ์ถ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(๊ฐ๋จํ ์ดํด๋ณด๊ธฐ์์).