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

📄 testdlg.cpp

📁 CY7C68013USB芯片的传输例程界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
       // TestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Test.h"
#include "TestDlg.h"

#include <process.h>
#include <winioctl.h>
#include "ezusbsys.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define ROW 94
//#define COL 94
#define COL 642
//#define COL 30

char PIPE_TYPE_STRINGS[4][4] = 
{
"CTL",
"ISO",
"BLK",
"INT"
};

char PIPE_DIRECTION[2][4] = 
{
"OUT",
"IN"
};
BOOL gStopTest;

/*
purpose:
     打开设备函数
input:
     devname 设备名	 
output:
	phDeviceHandle 设备句柄
return value:
     BOOLEAN变量  成功或者失败
*/
BOOL bOpenDriver (HANDLE * phDeviceHandle, PCHAR devname)
{
   char completeDeviceName[64] = "";
   char pcMsg[64] = "";
   
   strcat (completeDeviceName,
      "\\\\.\\"
      );
   
   strcat (completeDeviceName,
		    devname);
   
   *phDeviceHandle = CreateFile(  completeDeviceName,
      GENERIC_WRITE,
      FILE_SHARE_WRITE,
      NULL,
      OPEN_EXISTING,
      0,
      NULL);
   
   if (*phDeviceHandle == INVALID_HANDLE_VALUE) {
      return (FALSE);
   } else {
      return (TRUE);
   } 
}

UINT  TransferThread(
   void * pParam
)
{
    PTHREAD_CONTROL threadControl;
	threadControl=(PTHREAD_CONTROL)pParam;
	   

   // perform the ISO transfer
   threadControl->status = DeviceIoControl (threadControl->hDevice,
                                             threadControl->Ioctl,
                                             threadControl->InBuffer,
                                             threadControl->InBufferSize,
                                             threadControl->OutBuffer,
                                             threadControl->OutBufferSize,
                                             &threadControl->BytesReturned,
                                             NULL);

   // if an event exists, set it
   if (threadControl->completionEvent)
      SetEvent(threadControl->completionEvent);
   return 0;
}


UINT TestThread(
  void * pParam  // thread data
)
{
 
    CThreadParam*  ThreadParam;
	CTestDlg* TestDlg;


    HANDLE  hInDevice = NULL;
    HANDLE  hOutDevice = NULL;
    PUCHAR inBuffer = NULL;
    PUCHAR outBuffer = NULL;
    ULONG MaxTransferSize, CurrentTransferSize;
    ULONG InPipeNum;
    ULONG OutPipeNum;
    ULONG TestPass;
    ULONG Errors;
    HANDLE ReadCompleteEvent;
    HANDLE WriteCompleteEvent;

	ULONG CamCol,CamRow;
	ULONG iRedNum,iBlueNum,iGreenNum;
	unsigned char iCamData[ROW][COL];
	unsigned char iRedData[ROW*COL/4];
    unsigned char iBlueData[ROW*COL/4];
	unsigned char iGreenData[ROW*COL/4];

    ULONG  i,j;
    BULK_TRANSFER_CONTROL   inBulkControl,outBulkControl;
    THREAD_CONTROL inThreadControl,outThreadControl;
    char tempbuff[256];
    FILE *dumpfile;//保存测试数据
    FILE *binfile;
	FILE *fp;
	FILE *fp1,*fp2,*fp3;

	CamCol=0;
	CamRow=0;

	iRedNum=0;
	iBlueNum=0;
	iGreenNum=0;

	for(i=0;i<ROW;i++)
		for(j=0;j<COL;j++)
			iCamData[i][j]=255;

	for(i=0;i<ROW*COL/4;i++)
	{
		iRedData[i]=255;
		iBlueData[i]=255;
		iGreenData[i]=255;


	}

	ThreadParam=(CThreadParam *)pParam;
	TestDlg=ThreadParam->testDlg;

    if (bOpenDriver (&hInDevice, TestDlg->m_strName.GetBuffer(TestDlg->m_strName.GetLength())) != TRUE)
    {
       TestDlg->m_strOutput+="打开设备失败,测试线程结束\r\n";
	   ThreadParam->bUpdate=TRUE;
       return 0;
    }
    if (bOpenDriver (&hOutDevice, TestDlg->m_strName.GetBuffer(TestDlg->m_strName.GetLength())) != TRUE)
    {
       TestDlg->m_strOutput+="打开设备失败\r\n";
	   ThreadParam->bUpdate=TRUE;
       return 0;
    }
 
   // InPipeNum=2;    //changed codes....
  //  OutPipeNum=0;
	InPipeNum=2;
	//OutPipeNum=0;
    //sprintf(tempbuff,"IN PIPE = %d OUT PIPE = %d",InPipeNum,OutPipeNum);
	sprintf(tempbuff,"IN PIPE = %d" ,InPipeNum);
	ThreadParam->bUpdate=TRUE;
	TestDlg->m_strOutput+=tempbuff;
  
    //
    // get the transfer size and allocate the transfer buffers
    //
    MaxTransferSize = TestDlg->m_nSize;
    CurrentTransferSize = MaxTransferSize;
   // outBuffer = (unsigned char *)malloc(MaxTransferSize);
    inBuffer  = (unsigned char *)malloc(MaxTransferSize);
 
    //
    // seed the random number generator, and set our starting pattern
    //
 //   srand(TestDlg->m_nSize);
//	TestDlg->m_nSize=642*29;  //Code changed...
 
    //
    // initialize the pass and error counters
    //
    TestPass=0;
    Errors=0;

     //
    // Set up our event objects
    //
    ReadCompleteEvent = CreateEvent(0,FALSE,FALSE,NULL);
  //  WriteCompleteEvent = CreateEvent(0,FALSE,FALSE,NULL);
    //
    // main test loop
    //
//	fp = fopen("camera_data.txt","a");

    while (!gStopTest)//全局变量来决定是否退出测试线程
    {
 
		   // initialize the out buffer
		 //  for (i=0;i<CurrentTransferSize;i++)
			  // outBuffer[i] = rand();
		//	  outBuffer[i] = 'A';
		   // initialize the in buffer
		   memset(inBuffer, 0, MaxTransferSize);
 
          // initialize data structures for the read thread
     
          inBulkControl.pipeNum = InPipeNum;
          inThreadControl.hDevice = hInDevice;
 
          inThreadControl.Ioctl = IOCTL_EZUSB_BULK_READ;
          inThreadControl.InBuffer = (PVOID)&inBulkControl;
          inThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
          inThreadControl.OutBuffer = inBuffer;
          inThreadControl.OutBufferSize = CurrentTransferSize;
 
          inThreadControl.completionEvent = ReadCompleteEvent;
          inThreadControl.status = FALSE;
          inThreadControl.BytesReturned = 0;

          // initialize data structures for the write thread
 
       /*   outBulkControl.pipeNum = OutPipeNum;
          outThreadControl.hDevice = hOutDevice;
 
          outThreadControl.Ioctl = IOCTL_EZUSB_BULK_WRITE;
          outThreadControl.InBuffer = (PVOID)&outBulkControl;
          outThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
          outThreadControl.OutBuffer = outBuffer;
          outThreadControl.OutBufferSize = CurrentTransferSize;
 
          outThreadControl.completionEvent = WriteCompleteEvent;
          outThreadControl.status = FALSE;
          outThreadControl.BytesReturned = 0;  */
    
 
       // start and wait for transfer threads
		 
	      CWinThread * rd = AfxBeginThread( 
		  TransferThread, // thread function 
		  &inThreadControl); // argument to thread function 
	      inThreadControl.hThread = rd->m_hThread;

	/*	  CWinThread * wt = AfxBeginThread( 
		  TransferThread, // thread function 
		  &outThreadControl); // argument to thread function 
	      outThreadControl.hThread = wt->m_hThread;  */


          WaitForSingleObject(ReadCompleteEvent,INFINITE);	   
          //WaitForSingleObject(WriteCompleteEvent,INFINITE);

 
		   // if either the read or write failed, we want to stop the test
		   if (!inThreadControl.status)
		   {
			  TestDlg->m_strOutput+= "Error: Read failed\r\n";

			  TestDlg->m_strOutput+="Dumping OUT packet to file\r\n";
			  dumpfile = fopen("dumpfile.txt","w");
			  for (i=0;i<CurrentTransferSize; i++)
				 fprintf(dumpfile,"%X ",inBuffer[i]);
			  fclose(dumpfile);

			//  binfile = fopen("binfile.bix","wb");
		   fwrite(outBuffer,sizeof(BYTE),CurrentTransferSize,binfile);
			//  fclose(binfile);
			  gStopTest = TRUE;
		   }
		//   if( !outThreadControl.status)
		//   {
		//	  TestDlg->m_strOutput+= "Error: Write failed\r\n";
		 // gStopTest = TRUE;
		//   }

		   // verify the data, unless the user has disabled verify data
		   // or this was a write only test.
		   // make sure the correct amount of data was returned
		  if (inThreadControl.BytesReturned != CurrentTransferSize)
		  {
			 sprintf(tempbuff,
					  "Error: Length expected = %d actual = %d\r\n",
					  CurrentTransferSize,
					  inThreadControl.BytesReturned);
		   	TestDlg->m_strOutput+=tempbuff;

			 Errors++;
		    gStopTest = TRUE;
		  }
		  // copmpare the buffers
	//	  for (i=0;i<CurrentTransferSize;i++)
			   // for (i=0;i<1000;i++)
	//	  {
			/* if (inBuffer[i] != outBuffer[i])
			 {
				sprintf(tempbuff,
						 "Error: Data offset 0x%x expected = 0x%x actual = 0x%x\r\n",
						 i,
						 outBuffer[i],
						 inBuffer[i]);
				 TestDlg->m_strOutput+=tempbuff;
				Errors++;
       
			//       gStopTest = TRUE;
			 }  */
		                                      // add extra codes.....
			 
		//		TestDlg->m_strOutput+=inBuffer[i];
				//TestDlg->m_strOutput+='b';
			 
	//	  }
		  //如果有错误发生
		  if (Errors && (gStopTest == TRUE))
		  {
			 TestDlg->m_strOutput+="Dumping Error packet to file\r\n";
			// dumpfile = fopen("dumpfile.txt","w");
			// for (i=0;i<CurrentTransferSize;i++)
			//	fprintf(dumpfile,"%X\n",outBuffer[i]);
			// fclose(dumpfile);

			// binfile = fopen("binfile.bix","wb");
			 //fwrite(outBuffer,sizeof(BYTE),CurrentTransferSize,binfile);
			// fclose(binfile);
		  }

		 fp = fopen("camera_data.txt","w");
		//  for (i=0;i<CurrentTransferSize; i++)
				 
	   //  fwrite(inBuffer,sizeof(unsigned char),CurrentTransferSize,fp);

		  for(i=0;i<CurrentTransferSize;i++)
		  {
			    fprintf(fp,"%d%,",inBuffer[i]);
				iCamData[CamRow][CamCol]=inBuffer[i];
				
				CamCol++;
				if(CamCol>(COL-1))
				{
					
					CamRow++;
				    CamCol=0;
				}
				
		  }
		  for(i=0;i<ROW;i++)
          //for(i=0;i<CamRow;i++)
			  for(j=0;j<COL;j++)
			  {
					if((i%2==0)&&(j%2==0))
						iRedData[iRedNum++]=iCamData[i][j];
					if((i%2==1)&&(j%2==1))
						iBlueData[iBlueNum++]=iCamData[i][j];					    
					if((i%2==0)&&(j%2==1))
						iGreenData[iGreenNum++]=(iCamData[i][j]+iCamData[i+1][j-1])/2;
			  }
				  

		  fp1 = fopen("RedData.txt","w");
		  fp2 = fopen("BlueData.txt","w");
		  fp3 = fopen("GreenData.txt","w");
		 // for (i=0;i<COL*ROW/4; i++)
		 // {
			     //fprintf(fp1,"%d%,",iRedData[i]);
		         //fprintf(fp2,"%c",iBlueData[i]);
		        // fprintf(fp3,"%d ",iGreenData[i]);
		 // }

		  fwrite(iGreenData,sizeof(unsigned char),COL*ROW/4,fp3);
		  fwrite(iBlueData,sizeof(unsigned char),COL*ROW/4,fp2);
		  fwrite(iRedData,sizeof(unsigned char),COL*ROW/4,fp1);
				 
		  fclose(fp3);
		  fclose(fp2);
		  fclose(fp1);
		  fclose(fp);  

⌨️ 快捷键说明

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