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

📄 isofunc.cpp

📁 国半usbn9604芯片开发办的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -