SSPC-Tester/Driver/PCIE8586/Samples/VC/Advanced/ADThread.cpp

376 lines
8.4 KiB
C++
Raw Normal View History

#include "stdAfx.h"
#include "Sys.h"
#include "ADThread.h"
#include "ADDigitView.h"
#include "math.h"
CWinThread* m_ReadThread; // <20><><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
BOOL gl_bTerminateThr = TRUE; // <20>߳<EFBFBD><DFB3>Ƿ<EFBFBD>ɾ<EFBFBD><C9BE>
BOOL gl_bSmlThenSize = FALSE;
//////////////////////////////////////////////////////////////////////
//-------------------------------------------------------------------------------------------------------------------------------------
UINT ReadDataThread(PVOID hWnd);
//########################################################################
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲɼ<DDB2><C9BC>߳<EFBFBD>
BOOL MyStartDeviceAD(HANDLE hDevice)
{
if(!gl_bTerminateThr) // <20><>һ<EFBFBD><D2BB><EFBFBD>̻߳<DFB3>û<EFBFBD><C3BB>ɾ<EFBFBD><C9BE>
{
AfxMessageBox(_T("<EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD><EFBFBD>̻߳<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ"));
return FALSE;
}
m_ReadThread = AfxBeginThread(ReadDataThread,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_ReadThread->m_bAutoDelete = true; // <20>Զ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>߳<EFBFBD>
gl_bDeviceADRun = TRUE; // <20><>֮<EFBFBD>ɼ<EFBFBD><C9BC>߳̿<DFB3><CCBF>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD>
m_ReadThread->ResumeThread(); // <20><><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC>߳<EFBFBD>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;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> <20>̺߳<DFB3><CCBA><EFBFBD>
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; // <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
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) // <20><><EFBFBD>ֶ<EFBFBD><D6B6>ɼ<EFBFBD><C9BC>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>˾<EFBFBD>ֹͣ<CDA3>ɼ<EFBFBD><C9BC><EFBFBD>
{
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;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>ȡ״̬
ACTS1000_STATUS_AD ADStatus;
if(!ACTS1000_InitDeviceAD(hDevice, &ADPara)) // <20><>ʼ<EFBFBD><CABC><EFBFBD>
{
AfxMessageBox(_T("Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ϸ<EFBFBD><CFB8>Ϣ<EFBFBD><CFA2><EFBFBD>鿴log<6F>ļ<EFBFBD>"), 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++)// ѭ<><D1AD><EFBFBD>ɼ<EFBFBD>AD<41><44><EFBFBD><EFBFBD>
{
if(!gl_bDeviceADRun)
goto ExitReadThread;
if (!ACTS1000_StartDeviceAD(hDevice))// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
{
MsgBox(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>!"));
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) // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><DEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
{
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); // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѳɼ<D1B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>!"));
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; // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
}
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); // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѳɼ<D1B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
}
}
lBufferID++;
if (lBufferID >= MAX_SEGMENT)
lBufferID = 0;
if (nProcessMode == SAVE_MODE)
{
SetEvent(hEvent); // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѳɼ<D1B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
}
}
}
FinComplete:
ACTS1000_StopDeviceAD(hDevice); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
}// <20>߳<EFBFBD>ѭ<EFBFBD><D1AD>ȡ<EFBFBD><C8A1>
}
else
{
lBufferID = 0;
if (!ACTS1000_StartDeviceAD(hDevice))// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
{
MsgBox(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>!"));
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); // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѳɼ<D1B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
lSaveTime = GetTickCount();
}
}
}
}
else
{
nRead = ulReadCount;
while(gl_bDeviceADRun)
{
RetReadSizeWords = ACTS1000_ReadDeviceAD(hDevice, ADBuffer[lBufferID], nRead, &nRetSizeWords, &nAvailSampsPoints,1.0);
if(RetReadSizeWords == 0)
{
AfxMessageBox(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>!"));
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; // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
}
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); // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѳɼ<D1B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
}
}
lBufferID++;
if (lBufferID >= MAX_SEGMENT)
lBufferID = 0;
if (nProcessMode == SAVE_MODE)
{
SetEvent(hEvent); // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѳɼ<D1B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
}
nConstReadCnt++;
if (nConstReadCnt%4000==0)
{
if (ACTS1000_GetDevStatusAD(hDevice,&ADStatus))
{
if (ADStatus.bAheadTrig)
{
AfxMessageBox(_T("Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,1:<3A><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD> 2:<3A><><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>Ч<EFBFBD><D0A7> 3:ʹ<><CAB9>Simple\AD\Continue<EFBFBD>µ<EFBFBD>exe<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>!"));
goto ExitReadThread;
}
}
}
}
}
}
ExitReadThread:
SetEvent(hExitEvent); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>˳<EFBFBD><CBB3><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>ùر<C3B9><D8B1><EFBFBD><E8B1B8><EFBFBD>̵߳ô<CCB5><C3B4><EFBFBD>Ϣ
gl_bTerminateThr = TRUE;
gl_bCollected = TRUE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>βɼ<CEB2>
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;
}