📄 addoc.cpp
字号:
// 启动设备
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 + -