376 lines
8.4 KiB
C++
376 lines
8.4 KiB
C++
#include "stdAfx.h"
|
|
#include "Sys.h"
|
|
#include "ADThread.h"
|
|
#include "ADDigitView.h"
|
|
#include "math.h"
|
|
|
|
CWinThread* m_ReadThread; // 子线程句柄
|
|
BOOL gl_bTerminateThr = TRUE; // 线程是否删除
|
|
BOOL gl_bSmlThenSize = FALSE;
|
|
//////////////////////////////////////////////////////////////////////
|
|
//-------------------------------------------------------------------------------------------------------------------------------------
|
|
UINT ReadDataThread(PVOID hWnd);
|
|
//########################################################################
|
|
// 启动数据采集线程
|
|
BOOL MyStartDeviceAD(HANDLE hDevice)
|
|
{
|
|
if(!gl_bTerminateThr) // 上一次线程还没有删除
|
|
{
|
|
AfxMessageBox(_T("上一次的线程还没有中止"));
|
|
return FALSE;
|
|
}
|
|
|
|
m_ReadThread = AfxBeginThread(ReadDataThread,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
|
|
m_ReadThread->m_bAutoDelete = true; // 自动删除线程
|
|
gl_bDeviceADRun = TRUE; // 告之采集线程可以工作了
|
|
m_ReadThread->ResumeThread(); // 启动采集线程ReadDataThread_NotEmpty
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL bWriteCnt = 0;
|
|
//###############################################################
|
|
ACTS1000_PARA_AD gl_OldADPara = ADPara;
|
|
BOOL IsChangePara()
|
|
{
|
|
BOOL bRet;
|
|
if(memcmp(&gl_OldADPara, &ADPara, sizeof(ADPara))==0)
|
|
bRet = FALSE;
|
|
else
|
|
bRet = TRUE;
|
|
gl_OldADPara = ADPara;
|
|
return bRet;
|
|
}
|
|
BOOL gl_bStoped = FALSE;
|
|
|
|
// 读取数据 线程函数
|
|
UINT ReadDataThread(PVOID hWnd)
|
|
{
|
|
CSysApp *pApp=(CSysApp *)AfxGetApp();
|
|
CADDoc* pDoc=pApp->m_pADDoc;
|
|
ULONG ReadOffsetWords = 0;
|
|
LONG RetReadSizeWords;
|
|
int nADChannel = 0;
|
|
DWORD dTmp=0;
|
|
HANDLE hDevice = pApp->m_hDevice;
|
|
ULONG SampleCnt = 1; // 采集次数
|
|
ULONG SampleIndex;
|
|
ULONG RemainSizeWords = 0;
|
|
ULONG nRetSizeWords;
|
|
ULONG nAvailSampsPoints;
|
|
ULONG nIndex = 0;
|
|
BOOL bSuccess = FALSE;
|
|
ULONGLONG nReadSize;
|
|
ULONG nRead;
|
|
ULONG lSaveTime;
|
|
|
|
ULONG ulReadCount = MAX_RAM_SIZE;
|
|
if(gl_bAutoCollect) // 是手动采集的话,显示完了就停止采集了
|
|
{
|
|
SampleCnt = 0xFFFFFFFF;
|
|
}
|
|
gl_bStoped = FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
// for(int i=0; i<MAX_SEGMENT; i++)
|
|
// {
|
|
// memset(ADBuffer[i], 0, MAX_RAM_SIZE*sizeof(USHORT));
|
|
// }
|
|
|
|
|
|
LONG lBufferID = 0;
|
|
ULONG nConstReadCnt = 0;// 连续方式下用于获取状态
|
|
ACTS1000_STATUS_AD ADStatus;
|
|
|
|
if(!ACTS1000_InitDeviceAD(hDevice, &ADPara)) // 初始化设备
|
|
{
|
|
AfxMessageBox(_T("硬件初始化错误,详细信息请查看log文件"), MB_ICONERROR);
|
|
|
|
goto ExitReadThread;
|
|
}
|
|
|
|
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_MIDL)
|
|
{
|
|
gl_ReadSizeWords = (ADPara.M_Length + ADPara.N_Length)*gl_nChannelCount;
|
|
}
|
|
else
|
|
{
|
|
gl_ReadSizeWords = ADPara.N_Length;
|
|
gl_ReadSizeWords = gl_ReadSizeWords*gl_nChannelCount;
|
|
}
|
|
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_POST || ADPara.TriggerMode == ACTS1000_TRIGMODE_DELAY)
|
|
{
|
|
if (ADPara.TrigCount==0)
|
|
{
|
|
gl_ReadSizeWords = 0xFFFFFFFFFFFFFFFF;
|
|
}
|
|
else
|
|
{
|
|
gl_ReadSizeWords = gl_ReadSizeWords*ADPara.TrigCount;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
lSaveTime = GetTickCount();
|
|
gl_bTerminateThr = FALSE ;
|
|
//ULONG nTTT = 0;
|
|
if (ADPara.SampleMode == ACTS1000_SAMPMODE_FINITE)
|
|
{
|
|
for(SampleIndex = 0; SampleIndex<SampleCnt; SampleIndex++)// 循环采集AD数据
|
|
{
|
|
if(!gl_bDeviceADRun)
|
|
goto ExitReadThread;
|
|
if (!ACTS1000_StartDeviceAD(hDevice))// 初始化后,启动设备工作
|
|
{
|
|
|
|
MsgBox(_T("启动失败!"));
|
|
goto ExitReadThread;
|
|
}
|
|
//ACTS1000_SetDeviceTrigAD(hDevice);
|
|
|
|
if (ADPara.bSaveFile)
|
|
{
|
|
while(TRUE)
|
|
{
|
|
if(!ACTS1000_GetDevStatusAD(hDevice, &gl_ADStatus))
|
|
{
|
|
MsgBox(_T("GetDevStatusAD Error"));
|
|
goto ExitReadThread;
|
|
}
|
|
if(gl_ADStatus.bComplete) // 自动存盘单次有限点任务是否完成
|
|
{
|
|
goto FinComplete;
|
|
}
|
|
else
|
|
{
|
|
if(!gl_bDeviceADRun) goto ExitReadThread;
|
|
Sleep(1);
|
|
}
|
|
if (GetTickCount()-lSaveTime>300)
|
|
{
|
|
if (gl_ADStatus.lSavePoints>FileLenghtWords)
|
|
{
|
|
FileLenghtWords=gl_ADStatus.lSavePoints;
|
|
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
|
|
lSaveTime = GetTickCount();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else // if (ADPara.bSaveFile)
|
|
{
|
|
|
|
|
|
nReadSize = gl_ReadSizeWords;
|
|
while (nReadSize>0)
|
|
{
|
|
if (nReadSize>=ulReadCount)
|
|
{
|
|
nRead = ulReadCount;
|
|
gl_bSmlThenSize = FALSE;
|
|
}
|
|
else
|
|
{
|
|
gl_bSmlThenSize = TRUE;
|
|
nRead = nReadSize;
|
|
}
|
|
NextRead:
|
|
if(!gl_bDeviceADRun)
|
|
goto ExitReadThread;
|
|
|
|
RetReadSizeWords = ACTS1000_ReadDeviceAD(hDevice, ADBuffer[lBufferID], nRead, &nRetSizeWords, &nAvailSampsPoints,1.0);
|
|
if(RetReadSizeWords == 0)
|
|
{
|
|
AfxMessageBox(_T("读数据出错!"));
|
|
goto ExitReadThread;
|
|
}
|
|
if (nRetSizeWords==0)
|
|
{
|
|
int a=0;
|
|
}
|
|
if (nRetSizeWords<=0)
|
|
{
|
|
goto NextRead;
|
|
}
|
|
// if (nRetSizeWords != 262144)
|
|
// {
|
|
// int a= 0;
|
|
// }
|
|
nReadSize -= nRetSizeWords;
|
|
bSuccess = TRUE;
|
|
if (nProcessMode == SAVE_MODE)
|
|
{
|
|
WriteFile(g_ArrFileOut,ADBuffer[lBufferID], nRetSizeWords*sizeof(WORD),&dTmp,NULL);
|
|
FileLenghtWords += nRead; // 存盘文件大小增加
|
|
}
|
|
if (!m_bDrawComp)
|
|
{
|
|
glBufferID = lBufferID;
|
|
|
|
gl_Section.Lock();
|
|
//ADBuffer[lBufferID][10]= nTTT++;
|
|
gl_nDrawLen = nRetSizeWords/gl_nChannelCount;
|
|
gl_nDrawIdx = lBufferID;
|
|
gl_Section.Unlock();
|
|
|
|
if (nProcessMode != SAVE_MODE)
|
|
{
|
|
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
|
|
}
|
|
}
|
|
|
|
lBufferID++;
|
|
if (lBufferID >= MAX_SEGMENT)
|
|
lBufferID = 0;
|
|
if (nProcessMode == SAVE_MODE)
|
|
{
|
|
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
FinComplete:
|
|
ACTS1000_StopDeviceAD(hDevice); // 初始化后,启动设备工作
|
|
|
|
}// 线程循环取样
|
|
}
|
|
else
|
|
{
|
|
lBufferID = 0;
|
|
if (!ACTS1000_StartDeviceAD(hDevice))// 初始化后,启动设备工作
|
|
{
|
|
MsgBox(_T("启动失败!"));
|
|
goto ExitReadThread;
|
|
}
|
|
|
|
//ACTS1000_SetDeviceTrigAD(hDevice);
|
|
if (ADPara.bSaveFile)
|
|
{
|
|
while(TRUE)
|
|
{
|
|
if(!ACTS1000_GetDevStatusAD(hDevice, &gl_ADStatus))
|
|
{
|
|
MsgBox(_T("GetDevStatusAD Error"));
|
|
goto ExitReadThread;
|
|
}
|
|
if(!gl_bDeviceADRun)
|
|
goto ExitReadThread;
|
|
Sleep(1);
|
|
if (GetTickCount()-lSaveTime>300)
|
|
{
|
|
if (gl_ADStatus.lSavePoints>FileLenghtWords)
|
|
{
|
|
FileLenghtWords=gl_ADStatus.lSavePoints;
|
|
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
|
|
lSaveTime = GetTickCount();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nRead = ulReadCount;
|
|
while(gl_bDeviceADRun)
|
|
{
|
|
RetReadSizeWords = ACTS1000_ReadDeviceAD(hDevice, ADBuffer[lBufferID], nRead, &nRetSizeWords, &nAvailSampsPoints,1.0);
|
|
if(RetReadSizeWords == 0)
|
|
{
|
|
AfxMessageBox(_T("读数据出错!"));
|
|
goto ExitReadThread;
|
|
}
|
|
if (nRetSizeWords<=0)
|
|
{
|
|
Sleep(1);
|
|
continue;
|
|
}
|
|
bSuccess = TRUE;
|
|
if (nProcessMode == SAVE_MODE)
|
|
{
|
|
WriteFile(g_ArrFileOut,ADBuffer[lBufferID], nRetSizeWords*sizeof(WORD),&dTmp,NULL);
|
|
|
|
FileLenghtWords += nRetSizeWords; // 存盘文件大小增加
|
|
}
|
|
|
|
if (!m_bDrawComp)
|
|
{
|
|
glBufferID = lBufferID;
|
|
|
|
gl_Section.Lock();
|
|
gl_nDrawLen = nRetSizeWords/gl_nChannelCount;
|
|
gl_nDrawIdx = lBufferID;
|
|
gl_Section.Unlock();
|
|
if (nProcessMode != SAVE_MODE)
|
|
{
|
|
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
|
|
}
|
|
|
|
|
|
}
|
|
lBufferID++;
|
|
if (lBufferID >= MAX_SEGMENT)
|
|
lBufferID = 0;
|
|
|
|
if (nProcessMode == SAVE_MODE)
|
|
{
|
|
SetEvent(hEvent); // 发送事件,告诉绘制窗口线程,该批数据已采集完毕
|
|
}
|
|
nConstReadCnt++;
|
|
if (nConstReadCnt%4000==0)
|
|
{
|
|
if (ACTS1000_GetDevStatusAD(hDevice,&ADStatus))
|
|
{
|
|
if (ADStatus.bAheadTrig)
|
|
{
|
|
AfxMessageBox(_T("硬件溢出,1:请降低采样率 2:提高程序效率 3:使用Simple\AD\Continue下的exe测试传输速度!"));
|
|
goto ExitReadThread;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ExitReadThread:
|
|
SetEvent(hExitEvent); // 发出设备成功退出消息,让关闭设备的线程得此消息
|
|
gl_bTerminateThr = TRUE;
|
|
gl_bCollected = TRUE; // 完成了一次采集
|
|
|
|
ACTS1000_StopDeviceAD(hDevice);
|
|
ACTS1000_ReleaseDeviceAD(hDevice);
|
|
|
|
if (!gl_bAutoCollect && bSuccess && gl_bStoped==FALSE)
|
|
{
|
|
//pApp->m_pADDoc->StopDeviceAD();
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL MyStopDeviceAD(HANDLE hDevice)
|
|
{
|
|
CSysApp *pApp=(CSysApp *)AfxGetApp();
|
|
|
|
gl_bDeviceADRun = FALSE;
|
|
if (gl_bAutoTrig)
|
|
{
|
|
ACTS1000_SetDeviceTrigAD(pApp->m_hDevice);
|
|
}
|
|
if (gl_bAutoCollect == FALSE)
|
|
{
|
|
|
|
gl_bStoped = TRUE;
|
|
WaitForSingleObject(m_ReadThread->m_hThread, 1000);
|
|
}
|
|
else
|
|
{
|
|
WaitForSingleObject(m_ReadThread->m_hThread, INFINITE);
|
|
}
|
|
bCreateDevice = FALSE;
|
|
return TRUE;
|
|
}
|
|
|