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

📄 addoc.cpp

📁 AD 数据采集卡基本的采集界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// 启动设备
	switch(nSampleMode)
	{
	case NOT_EMPTY_MODE: // 非空方式
		 if(!StartDeviceAD_NotEmpty(pApp->m_hDevice, ADPara))
			 return;
		break;
	case HALF_MODE: // 半满方式
		if(!StartDeviceAD_Half(pApp->m_hDevice, ADPara))
			return;
		break;
	case INT_MODE:  // 中断方式
		if(!StartDeviceAD_Int(pApp->m_hDevice, ADPara))
			return;
		break;
	}
	pParaCfgView->EnableWindows(FALSE);
	//////////////////////////////////////////////////////////////
	m_DrawWindowThread->ResumeThread(); // 启动绘制窗口线程
	pShow->SetStatusTimer(500); // 由此定时器更新采集进度显示

	nLoopSize=(8192-8192%ChannelCount)/ChannelCount;
}
UINT ProccessDataThread(PVOID hWnd)  // 绘制数据线程
{
	CSysApp *pApp=(CSysApp *)AfxGetApp();
	CADFrame *pFrm=pApp->m_ADFrame ;
	CADDoc* pDoc=pApp->m_pADDoc; 
	// 在线程中取得视图指针
	CADDigitView* pDigitView=(CADDigitView*)(CWnd::FromHandle(pDoc->m_hWndDigit)); 
	CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pDoc->m_hWndWave)); 
	
	CString str;

	BOOL bFirst=TRUE;    
	ULONG WroteMB=0;  
	ULONG WroteLengthWords=0;
	ULONG MaxLengthWords = (pDoc->m_RemainMB)*1024*1024; // 转换成字长

	pDoc->m_Wrote8KWCounter=0;
	pDoc->m_WroteMB=0;
	CurrentIndex=0;
	int ShowCount=0;
	int tmpNum;
	int nChannelCount=ADPara.ChannelCount ;
	int nLsb;
	bFirstDisp=TRUE;
	bDrawing=FALSE;	
	while(bDeviceADRun)  // 循环采集AD数据
	{
		WaitForSingleObject(hEvent, INFINITE);
		CurrentProgress++;
		while(bNewSegmentData[CurrentIndex]==TRUE)
		{
			if(bDataProcessing==FALSE) DrawIndex=CurrentIndex; // 如果窗口已完成数据刷新,则置新的缓冲区索引号,使之绘制新缓冲区数据
			switch(nProcessMode)  // 数据处理
			{
			case 1: // 数字显示
				if(!m_FirstScreenStop || bFirst)  // 如果不停止首屏显示
				{
					pDoc->UpdateAllViews(pDigitView, 1, NULL);  // 传递1,要求重绘数字视图					
					m_bProgress=TRUE; // 使OnDraw函数能更新进度条
					bFirst=FALSE; // 置不是第一次采集的标志
				}
				break; 
			case 2:  // 波形显示
				if(!m_FirstScreenStop|| bFirst)
				{
					pDoc->UpdateAllViews(pWaveView, 2, NULL);	// 传递2,要求重绘波形视图
					m_bProgress=TRUE; // 使OnDraw函数能更新进度条				
					bFirst=FALSE;
				}
				break;
			case 3: // 数据存盘
				// 关于ID号为0的文件对象的初始化请见菜单《新建数据文件》的代码
				if(WroteLengthWords>=MaxLengthWords)
				{
					AfxMessageBox("对不起,当前磁盘已满,不能再存盘",MB_ICONSTOP,0);
					return FALSE;
				}
				PCI2006_WriteFile(hFileObject, ADBuffer[CurrentIndex], ReadSizeWords * 2 ); // 将8192个字的数据存放在硬盘上
				FileLenghtWords+=ReadSizeWords;
				break;
			}
			bNewSegmentData[CurrentIndex] = FALSE; // 当该段缓冲区数据被处理后,置缓冲区标志为FALSE,表示已无效
			if(m_bBounce && (nProcessMode!=3))//如果进行串道分析 且不是存盘方式
			{
				for(ShowCount=0;ShowCount<m_nBouncePointsCount;ShowCount++)
				{
					//Beep(3000, 1); // 响铃通知用户,线程已终止
					tmpNum=m_nBounceChannel+nChannelCount*ShowCount;
					nLsb=(ADBuffer[CurrentIndex][tmpNum]^0x2000)&0x3FFF;

					str.Format("%x,%x,%x        ",nLsb,m_nLower,m_nUpper);
					pWaveView->GetDC()->TextOut(10,10,str);

					if( (m_nLower>nLsb)||(m_nUpper<nLsb))
					{
						m_nBounceNum++;
						if(m_BounceStop)
						{
							m_FirstScreenStop=TRUE;//停止刷新
						}
						if((!m_BounceStop)&&m_FirstScreenStop)
							m_FirstScreenStop=FALSE;
					}
				}
			}
			CurrentIndex++;
			if(CurrentIndex==MAX_SEGMENT) CurrentIndex=0;
		}
	}// 线程循环处理及显示
	return TRUE;
}

void CADDoc::Public_ReleaseDevice(void) // 供MDI窗口调用
{
	StopDeviceAD();
}

void CADDoc::StopDeviceAD() 
{
	CSysApp *pApp=(CSysApp *)AfxGetApp();
	bDeviceADRun=FALSE; // 停止子线程进行连续数据采集		
	CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
	pShow->KillStatusTimer(); // 停止定时器,不再刷新进度条

	switch(nSampleMode)
	{
	case NOT_EMPTY_MODE: // 
	    StopDeviceAD_NotEmpty(pApp->m_hDevice);
		break;
	case HALF_MODE:
		StopDeviceAD_Half(pApp->m_hDevice);
		break;
	case INT_MODE:
		StopDeviceAD_Int(pApp->m_hDevice);
		break;	
	}
	bCreateDevice = FALSE;	
	// 终止绘图线程
	if(m_DrawWindowThread)
	{	
		//WaitForSingleObject(m_DrawWindowThread->m_hThread, INFINITE);	// 等待子线程停止
		WaitForSingleObject(hExitEvent, INFINITE);
	}

	if(m_DrawWindowThread)
	{
		m_DrawWindowThread->ExitInstance();
		m_DrawWindowThread=NULL;
	}
	PCI2006_ReleaseSystemEvent(hEvent);//释放消息
	// 终止采集线程
	CProgressCtrl* pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus1.GetDlgItem(IDC_PROGRESS));
	pProgress->SetPos(0);  // 释放设备时,置进度条为起值
	// 在设备对象释放后,允许操作硬件参数
	pParaCfgView->EnableWindows(TRUE);	
	bCreateDevice = FALSE;     // 释放设备后,视设备未创建

	if(nProcessMode==3)  // 如果数据处理方式为存盘
	{
		OnCloseFile();//释放文件
		nProcessMode=1; // 置成数字方式
		CButton* pDataSave=(CButton*)(pADStatusView->GetDlgItem(IDM_Check_DataSave));
		pDataSave->EnableWindow(FALSE);  // 使存盘方式单选框有效
	}
}


void CADDoc::OnDataFileNew() 
{
	// TODO: Add your command handler code here
	CString strNewFileName;
	CSysApp* pApp=(CSysApp*)AfxGetApp();
	if (!(pApp->DoPromptFileName(strNewFileName, IDS_NEW_FILE,
		OFN_HIDEREADONLY | OFN_CREATEPROMPT, TRUE, NULL)))
		return;
	
	if(!m_bFirstCreateDeviceFile)
	{  // 如果不是第一次创建文件对象,则释放老文件对象
		if ( ! PCI2006_ReleaseFile( hFileObject ) )
		{
			AfxMessageBox("释放文件对象失败...",MB_ICONSTOP,0);
		}
	} 
	// 创建新文件对象
	hFileObject =  PCI2006_CreateFileObject( pApp->m_hDevice, strNewFileName, PCI2006_modeCreate|PCI2006_modeWrite ) ;
    if ( hFileObject == INVALID_HANDLE_VALUE )
		
	{
		AfxMessageBox("初始化文件对象失败...",MB_ICONSTOP,0);
		return;
	}	
	
	CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
	pShow->ShowHideDlgSave ();	//显示存盘栏
	pShow->ShowHideStatus(FALSE);//隐藏状态栏
	
	CButton* pDataSave=(CButton*)(pADStatusView->GetDlgItem(IDM_Check_DataSave));	
	pDataSave->EnableWindow(TRUE);  // 使存盘方式单选框有效
	
	ULONGLONG DiskFreeBytes=PCI2006_GetDiskFreeBytes(strNewFileName.Left(3));  // 取得文件所在磁盘可用空间
	// 取得文件所在磁盘可用空间 */
	m_RemainMB=(ULONG)(DiskFreeBytes/(1024*1024));  // 求出有多少M字	
	CString str;
	
	if(m_RemainMB<2) 
	{
		AfxMessageBox("硬盘剩余空间不足2M,存盘操作不能进行...",MB_ICONSTOP,0);
		return;
	}
	str.Format("%d Mb",m_RemainMB);
	pShow->m_DiskFree()->SetWindowText (str);// 置当前硬盘可用空间MB
	
	pShow->m_Progress()->SetRange32(0,1024);// 设置进程范围
	pShow->m_Progress()->SetPos(0);
	
	/////////////
	pShow->m_FileName ()->SetWindowText(strNewFileName);//显示存盘文件名
	m_bFirstCreateDeviceFile=FALSE;  // 若成功文件对象,则置标志	

	m_bCloseFile=FALSE; // 有文件没有关闭,可以操作《关闭当前文件》菜单
	nProcessMode=3; // 当打开新文件时,意味着要进行存盘处理
	pADStatusView->SetDlgCheck();
}


void CADDoc::OnCloseFile() 
{
	// TODO: Add your command handler code here	
	PCI2006_ReleaseFile( hFileObject );
	m_bCloseFile=TRUE;  // 文件被关闭
	nProcessMode=1; // 当关闭新文件时,意味着要不能再进行存盘处理,因此置成数字方式
	m_bFirstCreateDeviceFile=TRUE; // 当新文件被关闭后,意味着以后新文件还是第一次被创建 
	///////
	CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
	CButton* pDataSave=(CButton*)(pADStatusView->GetDlgItem(IDM_Check_DataSave));	
	pDataSave->EnableWindow(TRUE);  // 使存盘方式单选框有效
	
	CString str;
	str.Format("%d", 0);
	pShow->m_DiskFree()->SetWindowText(str);
	pShow->ShowHideDlgSave (FALSE);//隐藏存盘栏
	pShow->ShowHideStatus();//显示状态栏
	pShow->m_Progress()->SetRange32(0,m_RemainMB);  // 设置进程范围
	pShow->m_Progress()->SetPos(0);	
	// 一兆进度
	pADStatusView->SetDlgCheck();
}

void CADDoc::OnListDevice() 
{
	// TODO: Add your command handler code here
	HANDLE hDevice;
	CSysApp *pApp=(CSysApp *)AfxGetApp();
	DeviceID = 0;  // 取得当前应用程序使用的设备ID号
	hDevice =PCI2006_CreateDevice(DeviceID);
	PCI2006_ListDeviceDlg(hDevice);
	PCI2006_ReleaseDevice(hDevice);
}

⌨️ 快捷键说明

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