⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bulkfunc.cpp

📁 基于ARM的应用Source6
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -