📄 isofunc.cpp
字号:
if (processThread)
processThread->ResumeThread();
if (testRun)
switch (command)
{
case ISOCH_SEND_IMM_BACK:
readThreadRun = FALSE;
writeThreadRun = FALSE;
curUSBDriver->StopTransferPipe(Pipe[readPipe].dwNumber);
curUSBDriver->StopTransferPipe(Pipe[writePipe].dwNumber);
if (readThread)
readThread->ResumeThread();
if (writeThread)
writeThread->ResumeThread();
break;
case ISOCH_SEND_DATA:
readThreadRun = FALSE;
curUSBDriver->StopTransferPipe(Pipe[readPipe].dwNumber);
if (readThread)
readThread->ResumeThread();
break;
case ISOCH_GET_DATA:
writeThreadRun = FALSE;
curUSBDriver->StopTransferPipe(Pipe[writePipe].dwNumber);
if (writeThread)
writeThread->ResumeThread();
break;
}
*/
}
UINT IsoFunc::ReadIsoThread(LPVOID par)
{
IsoFunc *curIsoFunc = (IsoFunc *)par;
/* for progress bar */
int maxChunk = 1;
BYTE *buffer = curIsoFunc->readBuff;
int readBytes = 0;
int pipeAdd = curIsoFunc->Pipe[curIsoFunc->readPipe].dwNumber;
DWORD start;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
maxChunk = curIsoFunc->dataSize/DATA_CHUNK_SIZE;
if (curIsoFunc->dataSize%DATA_CHUNK_SIZE)
maxChunk++;
//maxChunk = 0;
maxChunk--;
while ((curIsoFunc->readThreadRun) && (maxChunk > 0))
{
start = GetTickCount();
if ((readBytes = curUSBDriver->WorkWithPipe(pipeAdd,buffer,DATA_CHUNK_SIZE ,TRUE)) != DATA_CHUNK_SIZE)
{ /* error */
if (curIsoFunc->readThreadRun)
{
(curIsoFunc->isoTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curIsoFunc->restToRead -= readBytes;
curIsoFunc->readThreadRun = FALSE;
}
return -1;
}
curIsoFunc->readTime += (GetTickCount() - start);
/* for progress bar */
buffer += readBytes;
curIsoFunc->restToRead -= readBytes;
((isoCmdTab *)(curIsoFunc->isoTab))->m_progressBar.StepIt();
maxChunk--;
}
if (!curIsoFunc->readThreadRun)
{
/* process was stopped */
return 0;
}
/* Read last chunk */
start = GetTickCount();
if ((readBytes = curUSBDriver->WorkWithPipe(pipeAdd,buffer,curIsoFunc->restToRead,TRUE)) != curIsoFunc->restToRead)
{ /* error */
if (curIsoFunc->readThreadRun)
{
(curIsoFunc->isoTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curIsoFunc->restToRead -= readBytes;
curIsoFunc->readThreadRun = FALSE;
};
}
curIsoFunc->readTime += (GetTickCount() - start);
((isoCmdTab *)(curIsoFunc->isoTab))->m_progressBar.StepIt();
curIsoFunc->restToRead = 0;
return 0;
}
UINT IsoFunc::WriteIsoThread(LPVOID par)
{
IsoFunc *curIsoFunc = (IsoFunc *)par;
int maxChunk = 1;;
BYTE *buffer = curIsoFunc->writeBuff;
int pipeAdd = curIsoFunc->Pipe[curIsoFunc->writePipe].dwNumber;
int writeByte = 0;
DWORD start;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
maxChunk = curIsoFunc->dataSize/DATA_CHUNK_SIZE;
if (curIsoFunc->dataSize%DATA_CHUNK_SIZE)
maxChunk++;
//maxChunk = 0;
maxChunk--;
while ((curIsoFunc->writeThreadRun) && (maxChunk > 0))
{
start = GetTickCount();
if ((writeByte= curUSBDriver->WorkWithPipe(pipeAdd,buffer,DATA_CHUNK_SIZE,FALSE) )!= DATA_CHUNK_SIZE)
{ /* error */
if (curIsoFunc->writeThreadRun)
{
(curIsoFunc->isoTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curIsoFunc->restToWrite =- writeByte;
curIsoFunc->writeThreadRun = FALSE;
}
return -1;
}
curIsoFunc->writeTime += (GetTickCount() - start);
/* for progress bar */
buffer += writeByte;
curIsoFunc->restToWrite -= writeByte;
if (curIsoFunc->command != ISOCH_SEND_IMM_BACK)
((isoCmdTab *)(curIsoFunc->isoTab))->m_progressBar.StepIt();
maxChunk--;
}
if (!curIsoFunc->writeThreadRun)
{
/* process was stopped */
return 0;
}
/* Read last chunk */
start = GetTickCount();
if ((writeByte = curUSBDriver->WorkWithPipe(pipeAdd,buffer,curIsoFunc->restToWrite,FALSE)) != curIsoFunc->restToWrite)
{ /* error */
if (curIsoFunc->writeThreadRun)
{
(curIsoFunc->isoTab)->MessageBox("Cannot process current command.\nPlease check USB connection.","Error",MB_ICONERROR | MB_OK);
curIsoFunc->restToWrite =- writeByte;
curIsoFunc->writeThreadRun = FALSE;
}
return -1;;
}
curIsoFunc->writeTime += (GetTickCount() - start);
if (curIsoFunc->command != ISOCH_SEND_IMM_BACK)
((isoCmdTab *)(curIsoFunc->isoTab))->m_progressBar.StepIt();
curIsoFunc->restToWrite = 0;
return 0;
}
UINT IsoFunc::ProcessIsoThread(LPVOID par)
{
IsoFunc *curIsoFunc = (IsoFunc *)par;
bool errorDetected = FALSE;
int i, j;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
curIsoFunc->testRun = TRUE;
switch (curIsoFunc -> command)
{
case ISOCH_SEND_IMM_BACK:
curIsoFunc->writeThreadRun = TRUE;
curIsoFunc -> writeThread = AfxBeginThread(WriteIsoThread,curIsoFunc);
curIsoFunc->readThreadRun = TRUE;
curIsoFunc -> readThread = AfxBeginThread(ReadIsoThread,curIsoFunc);
::WaitForSingleObject(curIsoFunc -> readThread->m_hThread,INFINITE);
::WaitForSingleObject(curIsoFunc -> writeThread->m_hThread,INFINITE);
if ((!curIsoFunc->writeThreadRun)||(!curIsoFunc->readThreadRun))
/* Error detected */
errorDetected = TRUE;
curIsoFunc->writeThreadRun = FALSE;
curIsoFunc->readThreadRun = FALSE;
/* check data */
for ( i = 0 , j = 0 ; j < (curIsoFunc->dataSize - curIsoFunc->restToWrite) ; i++ )
{
if (curIsoFunc->readBuff[i] != curIsoFunc->writeBuff[j] )
{
curIsoFunc->numOfErrors++;
/* probably we lost packet. Skip one packet in output buffer */
j += 64;
i--;
}
else
j++;
}
free(curIsoFunc->readBuff);
free(curIsoFunc->writeBuff);
curIsoFunc->writeBuff = NULL;
curIsoFunc->readBuff = NULL;
curIsoFunc->readThreadRun = FALSE;
curIsoFunc->writeThreadRun = FALSE;
break;
case ISOCH_SEND_DATA:
curIsoFunc->readThreadRun = TRUE;
curIsoFunc -> readThread = AfxBeginThread(ReadIsoThread,curIsoFunc);
::WaitForSingleObject(curIsoFunc -> readThread->m_hThread,INFINITE);
if (!curIsoFunc->readThreadRun)
{
/* Error detected */
errorDetected = TRUE;
}
curIsoFunc->readThreadRun = FALSE;
/* Checking data */
for ( i = 0 ; i < curIsoFunc->dataSize - curIsoFunc->restToRead ; i++ )
{
if (curIsoFunc->readBuff[i] != curIsoFunc->hexByte )
curIsoFunc->numOfErrors++;
}
/* free read buffer */
free(curIsoFunc->readBuff);
curIsoFunc->readBuff = NULL;
curIsoFunc->readThreadRun = FALSE;
break;
case ISOCH_GET_DATA:
curIsoFunc->writeThreadRun = TRUE;
curIsoFunc -> writeThread = AfxBeginThread(WriteIsoThread,curIsoFunc);
::WaitForSingleObject(curIsoFunc -> writeThread->m_hThread,INFINITE);
if (!curIsoFunc->writeThreadRun)
{
/* Error detected */
errorDetected = TRUE;
}
curIsoFunc->writeThreadRun = FALSE;
BYTE feedback[8];
if (!ControlFunc::SendSetupPacketIn(GET_ISO_FEEDBACK, 0,0,8,&feedback[0]))
{
/* Can't send setup packet */
errorDetected = TRUE;
(curIsoFunc->isoTab)->MessageBox("Cannot get feedback from USB device.","Error",MB_ICONERROR | MB_OK);
}
curIsoFunc->restToWrite = curIsoFunc->dataSize - *((int* )&feedback[0]);
curIsoFunc->numOfErrors = *((int* )&feedback[4]);
free(curIsoFunc->writeBuff);
curIsoFunc->writeBuff = NULL;
curIsoFunc->writeThreadRun = FALSE;
break;
}
if (!errorDetected)
(curIsoFunc->isoTab)->MessageBox("Isochronous operation is complete.","Success",MB_ICONINFORMATION | MB_OK);
((isoCmdTab *)(curIsoFunc->isoTab))->processStoped();
curUSBDriver->DecreaseUSBUsers();
curIsoFunc->testRun = FALSE;
curIsoFunc->processThread = NULL;
return 0;
}
int IsoFunc::CheckPipes()
{
int i = 0;
USBDriver *curUSBDriver = USBDriver::GetUSBDriver();
numOfPipe = 0;
if ( !curUSBDriver->IsUSBDriverHaveError())
{
for (i = 0; i < WD_USB_MAX_PIPE_NUMBER; i++)
if (curUSBDriver->CheckPipe(PIPE_TYPE_ISOCHRONOUS, i, &Pipe[numOfPipe]))
{
if ( Pipe[numOfPipe].direction == USB_DIR_IN)
readPipe = numOfPipe;
else
writePipe = numOfPipe;
numOfPipe++;
}
}
return numOfPipe;
}
CString IsoFunc::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 : ISOCHRONOUS 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 + -