summaryrefslogtreecommitdiff
path: root/hid/hclient/hclient.c
diff options
context:
space:
mode:
Diffstat (limited to 'hid/hclient/hclient.c')
-rw-r--r--hid/hclient/hclient.c118
1 files changed, 96 insertions, 22 deletions
diff --git a/hid/hclient/hclient.c b/hid/hclient/hclient.c
index 09114bf3..62ca83fd 100644
--- a/hid/hclient/hclient.c
+++ b/hid/hclient/hclient.c
@@ -752,7 +752,7 @@ CLM_AsyncRead(
FALSE,
&asyncDevice))
{
- printf("Failed opening the device for synchronous read.\n");
+ printf("Failed opening the device for asynchronous read.\n");
return;
}
@@ -2328,7 +2328,7 @@ bReadDlgProc(
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_SYNCH), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_ONCE), FALSE);
- EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT), FALSE);
+ EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT), FALSE);
Read(&syncDevice);
@@ -2379,7 +2379,7 @@ bReadDlgProc(
IDC_READ_ASYNCH_ONCE == LOWORD(wParam));
EnableWindow(GetDlgItem(hDlg, IDC_READ_ASYNCH_CONT),
- IDC_READ_ASYNCH_CONT == LOWORD(wParam));
+ IDC_READ_ASYNCH_CONT == LOWORD(wParam));
SetWindowText(GetDlgItem(hDlg, LOWORD(wParam)),
"Stop Asynchronous Read");
@@ -2394,7 +2394,7 @@ bReadDlgProc(
readContext.TerminateThread = TRUE;
WaitForSingleObject(readThread, INFINITE);
- }
+ }
break;
case IDCANCEL:
@@ -2402,8 +2402,9 @@ bReadDlgProc(
WaitForSingleObject(readThread, INFINITE);
//Fall through!!!
- case IDOK:
- CloseHidDevice(&asyncDevice);
+ case IDOK:
+ CloseHidDevice(&asyncDevice);
+ CloseHidDevice(&syncDevice);
EndDialog(hDlg,0);
break;
}
@@ -3697,9 +3698,12 @@ AsynchReadThreadProc(
)
{
HANDLE completionEvent;
- BOOL readStatus;
+ BOOL readResult;
DWORD waitStatus;
ULONG numReadsDone;
+ OVERLAPPED overlap;
+ DWORD bytesTransferred;
+
//
// Create the completion event to send to the the OverlappedRead routine
@@ -3743,10 +3747,10 @@ AsynchReadThreadProc(
// exit
//
- readStatus = ReadOverlapped( Context -> HidDevice, completionEvent );
+ readResult = ReadOverlapped( Context->HidDevice, completionEvent, &overlap );
-
- if (!readStatus)
+
+ if (!readResult)
{
break;
}
@@ -3761,11 +3765,12 @@ AsynchReadThreadProc(
//
// If completionEvent was signaled, then a read just completed
- // so let's leave this loop and process the data
+ // so let's get the status and leave this loop and process the data
//
if ( WAIT_OBJECT_0 == waitStatus)
- {
+ {
+ readResult = GetOverlappedResult(Context->HidDevice->HidDevice, &overlap, &bytesTransferred, TRUE);
break;
}
}
@@ -3788,8 +3793,8 @@ AsynchReadThreadProc(
Context -> HidDevice -> InputDataLength,
Context -> HidDevice -> Ppd);
- if (NULL != Context -> DisplayEvent)
- {
+ if (NULL != Context -> DisplayEvent)
+ {
PostMessage(Context -> DisplayWindow,
WM_DISPLAY_READ_DATA,
0,
@@ -3797,6 +3802,37 @@ AsynchReadThreadProc(
WaitForSingleObject( Context -> DisplayEvent, INFINITE );
}
+ else if (NULL != Context->DisplayWindow)
+ {
+ CHAR szTempBuff[1024];
+ PHID_DEVICE pDevice;
+ PHID_DATA pData;
+ UINT uLoop;
+
+ pDevice = (PHID_DEVICE)Context->HidDevice;
+
+ //
+ // Display all the data stored in the Input data field for the device
+ //
+ pData = pDevice->InputData;
+
+ SendMessage(GetDlgItem(Context->DisplayWindow, IDC_CALLOUTPUT),
+ LB_ADDSTRING,
+ 0,
+ (LPARAM)"-------------------------------------------");
+
+ for (uLoop = 0; uLoop < pDevice->InputDataLength; uLoop++)
+ {
+ ReportToString(pData, szTempBuff, sizeof(szTempBuff));
+
+ SendMessage(GetDlgItem(Context->DisplayWindow, IDC_CALLOUTPUT),
+ LB_ADDSTRING,
+ 0,
+ (LPARAM)szTempBuff);
+
+ pData++;
+ }
+ }
else if (NULL == Context -> DisplayWindow)
{
// Running in console mode
@@ -3804,9 +3840,10 @@ AsynchReadThreadProc(
CLM_PrintInputReport(Context -> HidDevice);
}
}
- } while ( !Context -> TerminateThread &&
+ } while ( readResult &&
+ !Context->TerminateThread &&
(INFINITE_READS == Context -> NumberOfReads ||
- numReadsDone < Context -> NumberOfReads));
+ numReadsDone < Context -> NumberOfReads));
AsyncRead_End:
@@ -3825,7 +3862,11 @@ SynchReadThreadProc(
do
{
Read(Context -> HidDevice);
-
+
+ if (Context->TerminateThread) {
+ break;
+ }
+
numReadsDone ++;
UnpackReport(Context -> HidDevice -> InputReportBuffer,
@@ -3844,13 +3885,46 @@ SynchReadThreadProc(
WaitForSingleObject( Context -> DisplayEvent, INFINITE );
}
-
- if (INFINITE_READS != Context -> NumberOfReads &&
- numReadsDone == Context -> NumberOfReads)
+ else if (NULL != Context->DisplayWindow)
{
- break;
+ CHAR szTempBuff[1024];
+ PHID_DEVICE pDevice;
+ PHID_DATA pData;
+ UINT uLoop;
+
+ pDevice = (PHID_DEVICE)Context->HidDevice;
+
+ //
+ // Display all the data stored in the Input data field for the device
+ //
+ pData = pDevice->InputData;
+
+ SendMessage(GetDlgItem(Context->DisplayWindow, IDC_CALLOUTPUT),
+ LB_ADDSTRING,
+ 0,
+ (LPARAM)"-------------------------------------------");
+
+ for (uLoop = 0; uLoop < pDevice->InputDataLength; uLoop++)
+ {
+ ReportToString(pData, szTempBuff, sizeof(szTempBuff));
+
+ SendMessage(GetDlgItem(Context->DisplayWindow, IDC_CALLOUTPUT),
+ LB_ADDSTRING,
+ 0,
+ (LPARAM)szTempBuff);
+
+ pData++;
+ }
+ }
+ else if (NULL == Context->DisplayWindow)
+ {
+ // Running in console mode
+ printf("Read #%d\n", numReadsDone);
+ CLM_PrintInputReport(Context->HidDevice);
}
- } while ( !Context -> TerminateThread);
+ } while (!Context->TerminateThread &&
+ (INFINITE_READS == Context->NumberOfReads ||
+ numReadsDone < Context->NumberOfReads));
PostMessage( Context -> DisplayWindow, WM_READ_DONE, 0, 0);
ExitThread(0);