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

📄 filemakerdlg.cpp

📁 此程序是利用VC实现了USB的驱动程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						cl = ( (data ) << 16 ) + ( (data) << 8 ) + ( ( data  ) & 0xff );
						pDC->SetPixel( 80 +  i, 270 + j, cl );
						pbuf++;

					}
				}
/*412 -
				i=0;
				j=0;
				do
				{	
					if ( *pbuf > 127 )
					{	
						data = ( *(pbuf+1) << 2 );
						cl = ( data << 16 ) + ( data << 8 ) + data;
						for ( k=0;k<=(*pbuf & 0x7f);k++ )
						{	
							pDC->SetPixel( 100 + i, 250 + j, cl );
							i++;
							if ( i >= 412 )
							{	
								i=0;
								j++;
								if ( j >= 288 )
									break;
							}
						}
						if ( j >= 288 )
							break;
						pbuf++;
					}
					else
					{
						data = ( *pbuf << 2 );
						cl = ( data << 16 ) + ( data << 8 ) + data;
						pDC->SetPixel( 100 + i, 250 + j, cl );
						i++;
						if ( i >= 412 )
						{	i=0;
							j++;
							if ( j >= 288 )
								break;
						}
					}
					pbuf++;
				}
				while( (pbuf - TheViewDataBuffer) < 128*1024 );
				*/							
				ReleaseDC(pDC);
				
				m_USBtransferring = FALSE;
				UpdateData(FALSE);
			
				//TheDeviceSampleState = TRUE;
				break;

		case 3:	
				m_USBtransferring = TRUE;
				UpdateData(FALSE);
				break;

		case 10:
				m_MessageList.AddString(MsgStr);
				MsgStr=_T("  ");
				i=0;
			//	for ( i=0;i<DataBuffer[0]+1;i++ )
				{//	tmp.Format("0x%02x,",DataBuffer[i+1]);
					MsgStr += tmp;
					if ( ( (i+1) % 8 ) == 0 )
					{	m_MessageList.AddString(MsgStr);
						MsgStr=_T("  ");
					}
				}
				m_MessageList.AddString(MsgStr);
				break;

		case 20:
				m_MessageList.AddString(MsgStr);

//				m_HandUp1 = TheChannelState.HangUpFlag;
				UpdateData(FALSE);
				break;
		
		case 21:
				m_MessageList.AddString(MsgStr);
				break;

		case 22:
				MsgStr.Format("控制寄存器1值 0x%02x", lParam);
				m_MessageList.AddString(MsgStr);
				break;

		case 25:
				m_CommondDataCtrl.EnableWindow(TRUE);
				break;

	};
}

void CFileMakerDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	if ( USBconnectstate || USB_Video_transfer || USB_Video_Playing )
	{	if ( MessageBox("确认中断运行过程?","进度提示",	MB_ICONEXCLAMATION | MB_OKCANCEL ) == IDCANCEL )
			return;
	}
	AllthreadQuit = TRUE;
	if(hThread_USB_Video!=NULL)
		WaitForSingleObject(hThread_USB_Video,INFINITE);
	if(hThread_USB_ISO_READ!=NULL)
		WaitForSingleObject(hThread_USB_ISO_READ,INFINITE);
	if(hThread_USB_ISO_WRITE!=NULL)
		WaitForSingleObject(hThread_USB_ISO_WRITE,INFINITE);
	if( TheWriteDataBuffer != NULL)
		free(TheWriteDataBuffer);
	if( TheViewDataBuffer != NULL)
		free(TheViewDataBuffer);

	CDialog::OnCancel();
}

unsigned WINAPI USB_ISO_READ_Thread(LPVOID pParam)			//数据读取处理线程
{

	ULONG i;
	HANDLE hTheThread=GetCurrentThread();
	SetThreadPriority(hTheThread,THREAD_PRIORITY_NORMAL);

	HANDLE  hDevice                         = NULL;
	BOOL	bResult                         = FALSE;
	ULONG	nBytes                          = 0;
	int     nItems                          = 0;
	ISO_TRANSFER_CONTROL 	IsoControl;
	ULONG                   bytesToRead;
	PUCHAR                  buffer = NULL;
	ULONG                   packetsRead;
	PUSBD_ISO_PACKET_DESCRIPTOR isoDesc;
	PUCHAR                  ptr;
	ULONG                   pass = 0;
	UCHAR                   count = 0;
	ULONG                   framesRead = 0;
	ULONG                   framesMissed = 0;

	if (bOpenDriver (&hDevice, "Ezusb-0") == FALSE)
	{
		MessageBox(NULL,_T("       初始化错误\n驱动程序未安装或通信线路未联接"),_T("安装错误"),MB_OK|MB_ICONHAND);
		hDevice = NULL;
		return 0;
	}

	IsoControl.PacketSize = 9;
	IsoControl.PacketCount = 32;	//max 250 ms
	IsoControl.PipeNum = 4;
	IsoControl.BufferCount = 2;
	IsoControl.FramesPerBuffer = 10;

	bytesToRead = IsoControl.PacketCount * (IsoControl.PacketSize + sizeof(USBD_ISO_PACKET_DESCRIPTOR));
	buffer = (PUCHAR) malloc(bytesToRead);
	if (!buffer)
	{
		MessageBox(NULL,_T("alloc Failed"),_T("安装错误"),MB_OK|MB_ICONHAND);
		CloseHandle(hDevice);
		return 0;
	}

	char TempChar[8];
	int c,j,k,l;

	
	while (!Stop_ISO_READ && !AllthreadQuit)
	{
		bResult = DeviceIoControl (hDevice,
						 IOCTL_Myusb_READ_ISO_BUFFER,
						 &IsoControl,
						 sizeof(ISO_TRANSFER_CONTROL),
						 buffer,
						 bytesToRead,
						 &nBytes,
						 NULL);

		if (bResult != TRUE)
		{
			MessageBox(NULL,_T("Read ISO Buffer Failed"),_T("安装错误"),MB_OK|MB_ICONHAND);
			break;
		}

		packetsRead = nBytes / (IsoControl.PacketSize + sizeof(USBD_ISO_PACKET_DESCRIPTOR));

		ptr = buffer;
		isoDesc = (PUSBD_ISO_PACKET_DESCRIPTOR) (buffer + (packetsRead * IsoControl.PacketSize));
		//char tmp[80];
		//sprintf(tmp,"packetsRead = %d",packetsRead);
		//m_Journal.AddJournalLog(tmp);
		for (i=0;i<packetsRead;i++)
		{
			 framesRead++;
			 if (!(framesRead % 1000))
			 {
				//SetDlgItemInt(hDlg,IDC_FRAMES_READ,framesRead/1000,FALSE);
				TheTimeCounter = framesRead/1000*1000 + TheTimeCounter % 1000;
				PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 0,0);
			 }

			 if (isoDesc[i].Length < 8 )
			 {
				framesMissed++;
				TheTimeCounter = TheTimeCounter / 1000*1000 + framesMissed % 1000;
				PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 0,0);

				if ( TheChannelEnable )
				{	
					//for(k=0;k<8;k++)
					//	TempChar[k] = 0;

					m_mydata.AddBufferData(TempChar,8);
				}
			 }
			 else
				if ( TheChannelEnable )
				{	
					for(k=0;k<8;k++)	//每mS内的采样次数=8
					{	l = *(ptr+k);
						c=0;
						for (j=0;j<8;j++)
						{	c <<= 1;
							if ( ( l & ( 0x01 << j ) ) > 0 )
								c |= 0x01;
						}
						TempChar[k] = l;
					}
					m_mydata.AddBufferData(TempChar,8);
				}

			 ptr += IsoControl.PacketSize;
		}

		Sleep(10);	//max 250 ms

   }
   
   CloseHandle (hDevice);
   free(buffer);
   return 0;
}

void CFileMakerDlg::OnButtonUpdate() 
{
	// TODO: Add your control notification handler code here
	if ( !TheUpdateDataReady )
	{
		UpdateData(TRUE);

		int filehandle,DataLength;
		CString Warning;
		char str[20];
		sprintf(str,"./%s.BIN",m_PlayFileName);
		if( ( filehandle = _open(str, _O_RDONLY | _O_BINARY ) )  != -1 )
		{	
			DataLength = (int) _filelength( filehandle );
			if ( ( TheUpdateStartAddress & 0x00ff) == 0
				&&	( DataLength + TheUpdateStartAddress ) <= 1048576 ) 		//1M bytes
			{	
				if ( TheUpdateDataBuffer != NULL )
					free(TheUpdateDataBuffer);

				TheUpdateDataBuffer = (unsigned char *)malloc( DataLength + 256 );
				if( TheUpdateDataBuffer == NULL )
				{	AfxMessageBox("不能分配足够的数据缓冲空间!");
					return;
				}

				if ( _read( filehandle, TheUpdateDataBuffer, DataLength ) == DataLength )
				{
					TheUpdateDataLength = DataLength / 256 + 1;
					TheUpdateDataAddress = ( TheUpdateStartAddress & 0x0fff00 ) >> 8;

					m_ButtonUpdate.SetWindowText(_T("停止更新"));
					m_FileNameCtrl.EnableWindow(FALSE);
					m_FlashUpdateAddrCtrl.EnableWindow(FALSE);
					TheUpdateDataReady = TRUE;
					_close( filehandle );
   					return;
				}
				Warning.Format("数据文件%s读取失败!",str);
				AfxMessageBox(Warning);
				_close( filehandle );
   				return;
			}
			Warning.Format("数据文件%s大小与起始地址不匹配!",str);
			AfxMessageBox(Warning);
			_close( filehandle );
   			return;
		}
		Warning.Format("数据文件%s打开错误!",str);
		AfxMessageBox(Warning);
		return;

	}
	else
	{
		m_ButtonUpdate.SetWindowText(_T("开始更新"));
		m_FileNameCtrl.EnableWindow(TRUE);
		m_FlashUpdateAddrCtrl.EnableWindow(TRUE);
		TheUpdateDataReady = FALSE;
	}
}

typedef struct _THREAD_CONTROL
{
   HANDLE hDevice;
   PISO_TRANSFER_CONTROL isoControl;
   PVOID buffer;
   ULONG buffSize;
   HANDLE completionEvent;
} THREAD_CONTROL, *PTHREAD_CONTROL;

void IsoTransferThread(
   LPVOID pp
)
{
   BOOLEAN bResult = FALSE;
   ULONG nBytes;
   PTHREAD_CONTROL threadControl = ( PTHREAD_CONTROL )pp;

   // reset the pipe
   bResult = DeviceIoControl (threadControl->hDevice,
               IOCTL_Myusb_RESETPIPE,
               &(threadControl->isoControl->PipeNum),
               sizeof(ULONG),
               NULL,
               0,
               &nBytes,
               NULL);

   if (!bResult)
   {
      goto IsoTransferDone;
   }

   // perform the ISO transfer
   bResult = DeviceIoControl (threadControl->hDevice,
                  IOCTL_Myusb_ISO_WRITE,
                  threadControl->isoControl,
                  sizeof(ISO_TRANSFER_CONTROL),
                  threadControl->buffer,
                  threadControl->buffSize,
                  &nBytes,
                  NULL);

IsoTransferDone:
   // if an event exists, set it
   if (threadControl->completionEvent)
		SetEvent(threadControl->completionEvent);

   return ;
}

typedef struct _READ_WRITE_FILE_THREAD_CONTROL
{
   CFile * pFile;
   BOOL	Direction;
   PVOID Buffer;
   ULONG inLength;
   ULONG outLength;
   BOOL	Result;
} READ_WRITE_FILE_THREAD_CONTROL, *P_READ_WRITE_FILE_THREAD_CONTROL;

unsigned WINAPI  ReadWriteBufferFromFile(
  LPVOID lpParameter
)
{	
	unsigned int c,l,j,k;
	P_READ_WRITE_FILE_THREAD_CONTROL pRWctrl = ( P_READ_WRITE_FILE_THREAD_CONTROL ) lpParameter;
	pRWctrl->Result = FALSE;

	if ( pRWctrl->Direction )
		pRWctrl->pFile->Write(pRWctrl->Buffer, pRWctrl->inLength);
	else
	{	pRWctrl->outLength = pRWctrl->pFile->Read(pRWctrl->Buffer, pRWctrl->inLength);
		for(k=0;k<pRWctrl->outLength;k++)	//每mS内的采样次数=8
		{	l = * ( (unsigned char *)pRWctrl->Buffer + k ) ;
			c=0;
			for (j=0;j<8;j++)
			{	c <<= 1;
				if ( ( l & ( 0x01 << j ) ) > 0 )
					c |= 0x01;
			}
			*((unsigned char *)pRWctrl->Buffer+k) = l;
		}
	}
	pRWctrl->Result = TRUE;
	return 0;
}

unsigned WINAPI USB_ISO_WRITE_Thread(
  LPVOID lpParameter
)
{
	return 0;
}


unsigned WINAPI USB_Video_Thread(
  LPVOID lpParameter
)
{	
	BOOL result;
	BOOL ClearDataFlag= FALSE;
	BOOL TheWholeReadEnable=FALSE,TheWholeReadIsReady=FALSE,TheDataWriteDone=FALSE;
	unsigned char *pSendBuffer,*pReadBuffer,*pBuffer;
	int TheDataReadLength,TheViewStartPoint;

	int temp,total;
	BYTE TheCounterError;
	BOOL TheDataDownloading=FALSE;
	int UpdateStartAddress,UpdateDataPackageNum;

	HANDLE hTheThread=GetCurrentThread();
	SetThreadPriority(hTheThread,THREAD_PRIORITY_TIME_CRITICAL);

	pSendBuffer=(BYTE*)malloc(64*1024);		//格口数据发送指针
	pReadBuffer=(BYTE*)malloc(64*1024);		//格口数据读取指针
	if(pSendBuffer==NULL || pReadBuffer==NULL)
	{
		::MessageBox(NULL,"内存不足","严重错误",MB_OK|MB_ICONHAND);
		return 0;
	}

	while (!Stop_Video_Connect && !AllthreadQuit)
	{	
		result=session.TransferSetupPacket( TEST_CMD, 0, 0, 0, session.hDataBuffer);

/*		if ( session.HaveDataToSendBack )
		{	pBuffer = pReadBuffer;
			if ( session.TransferSetupPacket(0x53, 0, 0, session.SendBackPackageNum, buffer) )
			{	Sleep(50);
				if ( session.DoRead (session.SendBackPackageNum, pBuffer ) )
				{	Sleep(50);
					memcpy( DataBuffer , pBuffer , session.SendBackPackageNum*256 );
					PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 10, 0 );
					ClearDataFlag = !session.TransferSetupPacket(0xc3, 0x02, 0x5a, 0, pBuffer);
					if ( !ClearDataFlag )
						Sleep(50);
				}
			}
		}

		if ( ClearDataFlag )
		{	if ( session.TransferSetupPacket(0xc3, 0x02, 0x5a, 0, buffer) )
			{	Sleep(50);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -