📄 bulkfunc.cpp
字号:
curUSBDriver->StopTransferPipe(Pipe[readPipe].dwNumber);
curUSBDriver->StopTransferPipe(Pipe[writePipe].dwNumber);
if (readThread)
readThread->ResumeThread();
if (writeThread)
writeThread->ResumeThread();
break;
case BULK_SEND_DATA:
readThreadRun = FALSE;
curUSBDriver->StopTransferPipe(Pipe[readPipe].dwNumber);
if (readThread)
readThread->ResumeThread();
break;
case BULK_GET_DATA:
writeThreadRun = FALSE;
curUSBDriver->StopTransferPipe(Pipe[writePipe].dwNumber);
if (writeThread)
writeThread->ResumeThread();
break;
}
*/
}
UINT BulkFunc::ReadBulkThread(LPVOID par)
{
BulkFunc *curBulkFunc = (BulkFunc *)par;
/* for progress bar */
int maxChunk = 1;
BYTE *buffer = curBulkFunc->readBuff;
int readBytes = 0;
int pipeAdd = curBulkFunc->Pipe[curBulkFunc->readPipe].dwNumber;
DWORD start;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
maxChunk = curBulkFunc->dataSize/DATA_CHUNK_SIZE;
if (curBulkFunc->dataSize%DATA_CHUNK_SIZE)
maxChunk++;
maxChunk--;
while ((curBulkFunc->readThreadRun) && (maxChunk > 0))
{
start = GetTickCount();
if ((readBytes = curUSBDriver->WorkWithPipe(pipeAdd,buffer,DATA_CHUNK_SIZE ,TRUE)) != DATA_CHUNK_SIZE)
{ /* error */
if (curBulkFunc->readThreadRun)
{
(curBulkFunc->bulkTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curBulkFunc->restToRead -= readBytes;
curBulkFunc->readThreadRun = FALSE;
}
return -1;
}
curBulkFunc->readTime += (GetTickCount() - start);
/* for progress bar */
buffer += readBytes;
curBulkFunc->restToRead -= readBytes;
((BulkCmdTab *)(curBulkFunc->bulkTab))->m_progressBar.StepIt();
maxChunk--;
}
if (!curBulkFunc->readThreadRun)
{
/* process was stopped */
return 0;
}
/* Read last chunk */
start = GetTickCount();
if ((readBytes = curUSBDriver->WorkWithPipe(pipeAdd,buffer,curBulkFunc->restToRead,TRUE)) != curBulkFunc->restToRead)
{ /* error */
if (curBulkFunc->readThreadRun)
{
(curBulkFunc->bulkTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curBulkFunc->restToRead -= readBytes;
curBulkFunc->readThreadRun = FALSE;
}
return -1;
}
curBulkFunc->readTime += (GetTickCount() - start);
((BulkCmdTab *)(curBulkFunc->bulkTab))->m_progressBar.StepIt();
curBulkFunc->restToRead = 0;
return 0;
}
UINT BulkFunc::WriteBulkThread(LPVOID par)
{
BulkFunc *curBulkFunc = (BulkFunc *)par;
int maxChunk = 1;;
BYTE *buffer = curBulkFunc->writeBuff;
int pipeAdd = curBulkFunc->Pipe[curBulkFunc->writePipe].dwNumber;
int writeByte = 0;
DWORD start;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
maxChunk = curBulkFunc->dataSize/DATA_CHUNK_SIZE;
if (curBulkFunc->dataSize%DATA_CHUNK_SIZE)
maxChunk++;
maxChunk--;
while ((curBulkFunc->writeThreadRun) && (maxChunk > 0))
{
start = GetTickCount();
if ((writeByte= curUSBDriver->WorkWithPipe(pipeAdd,buffer,DATA_CHUNK_SIZE,FALSE) )!= DATA_CHUNK_SIZE)
{ /* error */
if (curBulkFunc->writeThreadRun)
{
(curBulkFunc->bulkTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curBulkFunc->restToWrite -= writeByte;
curBulkFunc->writeThreadRun = FALSE;
}
return -1;
}
curBulkFunc->writeTime += (GetTickCount() - start);
/* for progress bar */
buffer += writeByte;
curBulkFunc->restToWrite -= writeByte;
if (curBulkFunc->command != BULK_SEND_IMM_BACK)
((BulkCmdTab *)(curBulkFunc->bulkTab))->m_progressBar.StepIt();
maxChunk--;
}
if (!curBulkFunc->writeThreadRun)
{
/* process was stopped */
return 0;
}
/* Read last chunk */
start = GetTickCount();
if ((writeByte = curUSBDriver->WorkWithPipe(pipeAdd,buffer,curBulkFunc->restToWrite,FALSE)) != curBulkFunc->restToWrite)
{ /* error */
if (curBulkFunc->writeThreadRun)
{
(curBulkFunc->bulkTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curBulkFunc->restToWrite -= writeByte;
curBulkFunc->writeThreadRun = FALSE;
}
return -1;
}
curBulkFunc->writeTime += (GetTickCount() - start);
if (curBulkFunc->command != BULK_SEND_IMM_BACK)
((BulkCmdTab *)(curBulkFunc->bulkTab))->m_progressBar.StepIt();
curBulkFunc->restToWrite = 0;
return 0;
}
UINT BulkFunc::ProcessBulkThread(LPVOID par)
{
BulkFunc *curBulkFunc = (BulkFunc *)par;
bool errorDetected = FALSE;
int i;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
curBulkFunc->testRun = TRUE;
switch (curBulkFunc -> command)
{
case BULK_SEND_IMM_BACK:
curBulkFunc->writeThreadRun = TRUE;
curBulkFunc -> writeThread = AfxBeginThread(WriteBulkThread,curBulkFunc);
curBulkFunc->readThreadRun = TRUE;
curBulkFunc -> readThread = AfxBeginThread(ReadBulkThread,curBulkFunc);
::WaitForSingleObject(curBulkFunc -> readThread->m_hThread,INFINITE);
::WaitForSingleObject(curBulkFunc -> writeThread->m_hThread,INFINITE);
curBulkFunc -> readThread = NULL;
curBulkFunc -> writeThread = NULL;
if ((!curBulkFunc->writeThreadRun)||(!curBulkFunc->readThreadRun))
/* Error detected */
errorDetected = TRUE;
curBulkFunc->writeThreadRun = FALSE;
curBulkFunc->readThreadRun = FALSE;
/* check data */
for ( i = 0 ; i < (curBulkFunc->dataSize - curBulkFunc->restToWrite) ; i++ )
{
if (curBulkFunc->readBuff[i] != curBulkFunc->writeBuff[i] )
curBulkFunc->numOfErrors++;
}
free(curBulkFunc->readBuff);
free(curBulkFunc->writeBuff);
curBulkFunc->writeBuff = NULL;
curBulkFunc->readBuff = NULL;
break;
case BULK_SEND_AFTER_LAST_BACK:
curBulkFunc->writeThreadRun = TRUE;
curBulkFunc -> writeThread = AfxBeginThread(WriteBulkThread,curBulkFunc);
::WaitForSingleObject(curBulkFunc -> writeThread->m_hThread,INFINITE);
if (!curBulkFunc->writeThreadRun)
{
/* Error detected */
errorDetected = TRUE;
break;
}
curBulkFunc->writeThreadRun = FALSE;
curBulkFunc->readThreadRun = TRUE;
curBulkFunc -> readThread = AfxBeginThread(ReadBulkThread,curBulkFunc);
::WaitForSingleObject(curBulkFunc -> readThread->m_hThread,INFINITE);
curBulkFunc -> readThread = NULL;
curBulkFunc -> writeThread = NULL;
if (!curBulkFunc->readThreadRun)
{
/* Error detected */
errorDetected = TRUE;
}
curBulkFunc->readThreadRun = FALSE;
/* checking data */
for ( i = 0 ; i < (curBulkFunc->dataSize - curBulkFunc->restToWrite) ; i++ )
{
if (curBulkFunc->readBuff[i] != curBulkFunc->writeBuff[i] )
curBulkFunc->numOfErrors++;
}
free(curBulkFunc->readBuff);
free(curBulkFunc->writeBuff);
curBulkFunc->writeBuff = NULL;
curBulkFunc->readBuff = NULL;
break;
case BULK_SEND_DATA:
curBulkFunc->readThreadRun = TRUE;
curBulkFunc -> readThread = AfxBeginThread(ReadBulkThread,curBulkFunc);
::WaitForSingleObject(curBulkFunc -> readThread->m_hThread,INFINITE);
curBulkFunc -> readThread = NULL;
if (!curBulkFunc->readThreadRun)
{
/* Error detected */
errorDetected = TRUE;
}
curBulkFunc->readThreadRun = FALSE;
/* Checking data */
for ( i = 0 ; i < curBulkFunc->dataSize - curBulkFunc->restToRead ; i++ )
{
if (curBulkFunc->readBuff[i] != curBulkFunc->hexByte )
curBulkFunc->numOfErrors++;
}
/* free read buffer */
free(curBulkFunc->readBuff);
curBulkFunc->readBuff = NULL;
break;
case BULK_GET_DATA:
curBulkFunc->writeThreadRun = TRUE;
curBulkFunc -> writeThread = AfxBeginThread(WriteBulkThread,curBulkFunc);
::WaitForSingleObject(curBulkFunc -> writeThread->m_hThread,INFINITE);
curBulkFunc -> writeThread = NULL;
if (!curBulkFunc->writeThreadRun)
{
/* Error detected */
errorDetected = TRUE;
}
else
{
curBulkFunc->writeThreadRun = FALSE;
curUSBDriver->CnangeBulkOutTestStatus(FALSE);
BYTE feedback[8];
if (!ControlFunc::SendSetupPacketIn(GET_BULK_FEEDBACK, 0,0,8,&feedback[0]))
{
/* Can't send setup packet */
errorDetected = TRUE;
(curBulkFunc->bulkTab)->MessageBox("Cannot get feedback from USB device.","Error",MB_ICONERROR | MB_OK);
}
curBulkFunc->restToWrite = curBulkFunc->dataSize - *((int* )&feedback[0]);
curBulkFunc->numOfErrors = *((int* )&feedback[4]);
}
free(curBulkFunc->writeBuff);
curBulkFunc->writeBuff = NULL;
break;
}
if (!errorDetected)
(curBulkFunc->bulkTab)->MessageBox("Bulk operation is complete.","Success",MB_ICONINFORMATION | MB_OK);
((BulkCmdTab *)(curBulkFunc->bulkTab))->processStoped();
curUSBDriver->DecreaseUSBUsers();
curBulkFunc->testRun = FALSE;
curBulkFunc->processThread = NULL;
return 0;
}
int BulkFunc::CheckPipes()
{
int i = 0;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
numOfPipes = 0;
if ( !curUSBDriver->IsUSBDriverHaveError())
{
for (i = 0; i < WD_USB_MAX_PIPE_NUMBER; i++)
if (curUSBDriver->CheckPipe(PIPE_TYPE_BULK, i, &Pipe[numOfPipes]))
{
if ( Pipe[numOfPipes].direction == USB_DIR_IN)
readPipe = numOfPipes;
else
writePipe = numOfPipes;
numOfPipes++;
}
}
return numOfPipes;
}
CString BulkFunc::getPipeInfo(int num)
{
CString pipeInfo;
CString pipeDir;
if ( Pipe[num].direction == USB_DIR_IN)
pipeDir.Format(_T("IN "));
else
pipeDir.Format(_T("OUT "));
pipeInfo.Format(_T("%d. Pipe : 0x%02x Type : BULK MaxPktSize : 0x%x Dir : "),num+1,Pipe[num].dwNumber,Pipe[num].dwMaximumPacketSize);
pipeInfo += pipeDir;
return pipeInfo;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -