so7_config新增脚踏开关使能设置。

This commit is contained in:
TAO Cheng
2014-05-09 11:05:52 +08:00
parent 5aec9f2552
commit 4f6272ff92
14 changed files with 468 additions and 168 deletions
+228 -97
View File
@@ -13,10 +13,13 @@ CART_PCI8622::CART_PCI8622()
m_AD_LSB_HALF=0.0;
m_AD_LSB_RANGE=65536;
m_InputRange=0;
m_StopedCapture=TRUE;
m_EnStartCapture=FALSE;
m_StopedSample=TRUE;
m_EnStartSample=FALSE;
m_EnGetData=FALSE;
m_iCaptureMode=0;
m_iSampleMode=0;
m_iReadDataSize=100;
m_iFirstChannel=1;
m_iLastChannel=2;
}
CART_PCI8622::~CART_PCI8622()
@@ -28,8 +31,11 @@ BOOL CART_PCI8622::Init()
{
BOOL rStatus(TRUE);
#ifdef _RELEASE_FULL_VERSION
int DeviceLgcID(0);
m_hDevice = PCI8622_CreateDevice(DeviceLgcID); // 创建设备对象
if(m_hDevice == INVALID_HANDLE_VALUE)
{
int DeviceLgcID(0);
m_hDevice = PCI8622_CreateDevice(DeviceLgcID); // 创建设备对象
}
if(m_hDevice == INVALID_HANDLE_VALUE)
{
rStatus=FALSE;
@@ -42,9 +48,9 @@ BOOL CART_PCI8622::Exit()
{
BOOL rStatus(TRUE);
#ifdef _RELEASE_FULL_VERSION
if (!m_StopedCapture)
if (!m_StopedSample)
{
rStatus=StopCaptureData();
rStatus=StopSampleData();
}
rStatus=PCI8622_ReleaseDevice(m_hDevice); // 释放设备对象
m_hDevice=INVALID_HANDLE_VALUE;
@@ -53,22 +59,25 @@ BOOL CART_PCI8622::Exit()
}
//========================================
BOOL CART_PCI8622::SetCaptureMode(int _Mode)
BOOL CART_PCI8622::SetSamplePara(int _Mode,int _ReadDataSize)
{
BOOL rStatus(TRUE);
m_iSampleMode=_Mode;
m_iReadDataSize=_ReadDataSize;
#ifdef _RELEASE_FULL_VERSION
m_iCaptureMode=_Mode;
memset(&ADBuffer, 0x00, sizeof(ADBuffer));
memset(&m_ADPara, 0x00, sizeof(m_ADPara)); // 将各项参数复位至确定值0(强烈建议)
switch(_Mode)
{
case E_ART_PCI8622_CAPTURE_DMA_SEQ:
case E_ART_PCI8622_CAPTURE_NPT_SEQ:
case E_ART_PCI8622_SAMPLE_DMA_SEQ:
case E_ART_PCI8622_SAMPLE_NPT_SEQ:
case E_ART_PCI8622_SAMPLE_HALF_SEQ:
{
// 预置硬件参数
m_ADPara.ADMode = PCI8622_ADMODE_SEQUENCE; // AD模式为连续模式
m_ADPara.FirstChannel = 1; // 首通道
m_ADPara.LastChannel = 2; // 末通道
m_ADPara.Frequency = 10000; // 采样频率(Hz)
m_ADPara.FirstChannel = m_iFirstChannel; // 首通道
m_ADPara.LastChannel = m_iLastChannel; // 末通道
m_ADPara.Frequency = 25000; // 采样频率(Hz)
m_ADPara.GroupInterval = 50; // 组间间隔(uS)
m_ADPara.LoopsOfGroup = 1; // 组内各通道点数
m_ADPara.Gains = PCI8622_GAINS_1MULT;
@@ -85,13 +94,14 @@ BOOL CART_PCI8622::SetCaptureMode(int _Mode)
m_ADPara.TimeoutForNpt = 10; // 在非空方式下,设置超时时间为10秒钟(只在非空查询方式下有效)
break;
}
case E_ART_PCI8622_CAPTURE_NPT_TRIGCLK:
case E_ART_PCI8622_CAPTURE_DMA_TRIGCLK:
case E_ART_PCI8622_SAMPLE_NPT_TRIGCLK:
case E_ART_PCI8622_SAMPLE_DMA_TRIGCLK:
case E_ART_PCI8622_SAMPLE_HALF_TRIGCLK:
{
// 预置硬件参数
m_ADPara.ADMode = PCI8622_ADMODE_GROUP; // AD模式为连续模式
m_ADPara.FirstChannel = 1; // 首通道
m_ADPara.LastChannel = 2; // 末通道
m_ADPara.FirstChannel = m_iFirstChannel; // 首通道
m_ADPara.LastChannel = m_iLastChannel; // 末通道
m_ADPara.Frequency = 10000; // 采样频率(Hz)
m_ADPara.GroupInterval = 50; // 组间间隔(uS)
m_ADPara.LoopsOfGroup = 1; // 组内各通道点数
@@ -162,34 +172,50 @@ BOOL CART_PCI8622::SetCaptureMode(int _Mode)
}
switch(_Mode)
{
case E_ART_PCI8622_CAPTURE_DMA:
case E_ART_PCI8622_CAPTURE_DMA_SEQ:
case E_ART_PCI8622_CAPTURE_DMA_TRIGCLK:
case E_ART_PCI8622_SAMPLE_DMA:
case E_ART_PCI8622_SAMPLE_DMA_SEQ:
case E_ART_PCI8622_SAMPLE_DMA_TRIGCLK:
{
m_hDmaEvent = PCI8622_CreateSystemEvent();
if (!PCI8622_InitDeviceDmaAD(m_hDevice, m_hDmaEvent, &ADBuffer[0][0], 4096, SEGMENT_COUNT, HALF_SIZE_WORDS, &m_ADPara)) // 初始化硬件
//if (!PCI8622_InitDeviceDmaAD(m_hDevice, m_hDmaEvent, &ADBuffer[0][0], 4096, SEGMENT_COUNT, HALF_SIZE_WORDS, &m_ADPara)) // 初始化硬件
if (!PCI8622_InitDeviceDmaAD(m_hDevice, m_hDmaEvent, &ADBuffer[0][0], m_iReadDataSize, SEGMENT_COUNT, HALF_SIZE_WORDS, &m_ADPara)) // 初始化硬件
{
rStatus=FALSE;
StopCaptureData();
StopSampleData();
}
break;
}
case E_ART_PCI8622_CAPTURE_NPT:
case E_ART_PCI8622_CAPTURE_NPT_SEQ:
case E_ART_PCI8622_CAPTURE_NPT_TRIGCLK:
case E_ART_PCI8622_SAMPLE_NPT:
case E_ART_PCI8622_SAMPLE_NPT_SEQ:
case E_ART_PCI8622_SAMPLE_NPT_TRIGCLK:
{
if (!PCI8622_InitDeviceProAD(m_hDevice, &m_ADPara))
{
rStatus=FALSE;
StopCaptureData();
StopSampleData();
}
break;
}
case E_ART_PCI8622_SAMPLE_HALF:
case E_ART_PCI8622_SAMPLE_HALF_SEQ:
case E_ART_PCI8622_SAMPLE_HALF_TRIGCLK:
{
if (!PCI8622_InitDeviceProAD(m_hDevice, &m_ADPara))
{
rStatus=FALSE;
StopSampleData();
}
break;
}
default:
{
break;
}
}
if (rStatus)
{
m_StopedCapture=FALSE;
m_EnStartCapture=TRUE;
m_StopedSample=FALSE;
m_EnStartSample=TRUE;
}
@@ -197,25 +223,81 @@ BOOL CART_PCI8622::SetCaptureMode(int _Mode)
return rStatus;
}
//========================================
BOOL CART_PCI8622::StartCaptureData()
BOOL CART_PCI8622::StartSampleData()
{
BOOL rStatus(TRUE);
#ifdef _RELEASE_FULL_VERSION
rStatus=PCI8622_StartDeviceDmaAD(m_hDevice); // 启动设备
m_StopedCapture=FALSE;
switch(m_iSampleMode)
{
case E_ART_PCI8622_SAMPLE_DMA:
case E_ART_PCI8622_SAMPLE_DMA_SEQ:
case E_ART_PCI8622_SAMPLE_DMA_TRIGCLK:
{
rStatus=PCI8622_StartDeviceDmaAD(m_hDevice); // 启动设备
break;
}
case E_ART_PCI8622_SAMPLE_NPT:
case E_ART_PCI8622_SAMPLE_NPT_SEQ:
case E_ART_PCI8622_SAMPLE_NPT_TRIGCLK:
{
rStatus=PCI8622_StartDeviceProAD(m_hDevice);
break;
}
case E_ART_PCI8622_SAMPLE_HALF:
case E_ART_PCI8622_SAMPLE_HALF_SEQ:
case E_ART_PCI8622_SAMPLE_HALF_TRIGCLK:
{
rStatus=PCI8622_StartDeviceProAD(m_hDevice);
break;
}
default:
{
break;
}
}
m_StopedSample=FALSE;
m_EnGetData=TRUE;
#endif //_RELEASE_FULL_VERSION
return rStatus;
}
//========================================
BOOL CART_PCI8622::StopCaptureData()
BOOL CART_PCI8622::StopSampleData()
{
BOOL rStatus(TRUE);
#ifdef _RELEASE_FULL_VERSION
rStatus=PCI8622_ReleaseDeviceDmaAD(m_hDevice); // 释放AD
rStatus=PCI8622_ReleaseSystemEvent(m_hDmaEvent);
m_EnStartCapture=FALSE;
m_StopedCapture=TRUE;
switch(m_iSampleMode)
{
case E_ART_PCI8622_SAMPLE_DMA:
case E_ART_PCI8622_SAMPLE_DMA_SEQ:
case E_ART_PCI8622_SAMPLE_DMA_TRIGCLK:
{
rStatus=PCI8622_ReleaseDeviceDmaAD(m_hDevice); // 释放AD
rStatus=PCI8622_ReleaseSystemEvent(m_hDmaEvent);
break;
}
case E_ART_PCI8622_SAMPLE_NPT:
case E_ART_PCI8622_SAMPLE_NPT_SEQ:
case E_ART_PCI8622_SAMPLE_NPT_TRIGCLK:
{
rStatus=PCI8622_ReleaseDeviceProAD(m_hDevice); // 释放AD
//rStatus=PCI8622_ReleaseDevice(m_hDevice); // 释放设备对象
break;
}
case E_ART_PCI8622_SAMPLE_HALF:
case E_ART_PCI8622_SAMPLE_HALF_SEQ:
case E_ART_PCI8622_SAMPLE_HALF_TRIGCLK:
{
rStatus=PCI8622_ReleaseDeviceProAD(m_hDevice); // 释放AD
//rStatus=PCI8622_ReleaseDevice(m_hDevice); // 释放设备对象
break;
}
default:
{
break;
}
}
m_EnStartSample=FALSE;
m_StopedSample=TRUE;
m_EnGetData=FALSE;
#endif //_RELEASE_FULL_VERSION
return rStatus;
@@ -233,69 +315,111 @@ BOOL CART_PCI8622::GetData(double (*_Data)[HALF_SIZE_WORDS],int* _DataNumber)
WORD ADData(0);
double dVolt(0);
int Index(0);
switch(m_iCaptureMode)
switch(m_iSampleMode)
{
case E_ART_PCI8622_CAPTURE_DMA:
case E_ART_PCI8622_CAPTURE_DMA_SEQ:
case E_ART_PCI8622_CAPTURE_DMA_TRIGCLK:
case E_ART_PCI8622_SAMPLE_DMA:
case E_ART_PCI8622_SAMPLE_DMA_SEQ:
case E_ART_PCI8622_SAMPLE_DMA_TRIGCLK:
{
PCI8622_STATUS_DMA DMAStatus; // DMA状态参数
PCI8622_GetDevStatusDmaAD(m_hDevice, &DMAStatus);
bool bWait(true);
while(bWait) // 查询当前物理缓冲区数据是否已准备就绪
{
bool bWait(true);
while(bWait) // 查询当前物理缓冲区数据是否已准备就绪
{
if(WaitForSingleObject (m_hDmaEvent, 100)==WAIT_OBJECT_0)
bWait=false; // 等待DMA事件
}
PCI8622_STATUS_DMA DMAStatus; // DMA状态参数
if(!PCI8622_GetDevStatusDmaAD(m_hDevice, &DMAStatus))
{
rStatus=FALSE;
StopCaptureData();
}
if(DMAStatus.bBufferOverflow)
{
rStatus=FALSE;
}
for(m_SegmentID=0; m_SegmentID<SEGMENT_COUNT; m_SegmentID++)
{
if(DMAStatus.bSegmentSts[m_SegmentID])
{
nADChannel = m_ADPara.FirstChannel;
for(Index=0; Index<64; Index++)
{
ADData = ((ADBuffer[m_SegmentID][Index]));
// 将原码转换为电压值
dVolt = static_cast<double>(((m_AD_LSB_MAX/m_AD_LSB_RANGE) * ADData - m_AD_LSB_HALF));
_Data[nADChannel][_DataNumber[nADChannel]]=dVolt;
_DataNumber[nADChannel]+=1;
nADChannel++;
if(nADChannel > m_ADPara.LastChannel)
{
nADChannel = m_ADPara.FirstChannel;
}
}
}
if(!PCI8622_SetDevStatusDmaAD(m_hDevice, m_SegmentID))
{
rStatus=FALSE;
StopCaptureData();
}
}
break;
if(WaitForSingleObject (m_hDmaEvent, 100)==WAIT_OBJECT_0)
bWait=false; // 等待DMA事件
}
case E_ART_PCI8622_CAPTURE_NPT:
case E_ART_PCI8622_CAPTURE_NPT_SEQ:
case E_ART_PCI8622_CAPTURE_NPT_TRIGCLK:
if(!PCI8622_GetDevStatusDmaAD(m_hDevice, &DMAStatus))
{
rStatus=FALSE;
StopSampleData();
}
if(DMAStatus.bBufferOverflow)
{
rStatus=FALSE;
}
for(m_SegmentID=0; m_SegmentID<SEGMENT_COUNT; m_SegmentID++)
{
if(DMAStatus.bSegmentSts[m_SegmentID])
{
TRACE1("[PCI8622_GetDevStatusDmaAD] m_SegmentID:%d.\r\n",m_SegmentID);
nADChannel = m_ADPara.FirstChannel;
for(Index=0; Index<m_iReadDataSize; Index++)
{
ADData = ((ADBuffer[m_SegmentID][Index]));
// 将原码转换为电压值
dVolt = static_cast<double>(((m_AD_LSB_MAX/m_AD_LSB_RANGE) * ADData - m_AD_LSB_HALF));
_Data[nADChannel][_DataNumber[nADChannel]]=dVolt;
_DataNumber[nADChannel]+=1;
nADChannel++;
if(nADChannel > m_ADPara.LastChannel)
{
nADChannel = m_ADPara.FirstChannel;
}
}
}
if(!PCI8622_SetDevStatusDmaAD(m_hDevice, m_SegmentID))
{
rStatus=FALSE;
StopSampleData();
}
}
break;
}
case E_ART_PCI8622_SAMPLE_NPT:
case E_ART_PCI8622_SAMPLE_NPT_SEQ:
case E_ART_PCI8622_SAMPLE_NPT_TRIGCLK:
{
m_SegmentID=0;
LONG nReadSizeWords = m_iReadDataSize;
LONG nRetSizeWords(0);
PCI8622_ReadDeviceProAD_Npt(m_hDevice, ADBuffer[m_SegmentID], nReadSizeWords, &nRetSizeWords);
nADChannel = m_ADPara.FirstChannel;
TRACE1("[PCI8622_ReadDeviceProAD_Npt] Retsize:%d.\r\n",nRetSizeWords);
for(Index=0; Index<nReadSizeWords; Index++)
{
ADData = ((ADBuffer[m_SegmentID][Index]));
// 将原码转换为电压值
dVolt = static_cast<double>(((m_AD_LSB_MAX/m_AD_LSB_RANGE) * ADData - m_AD_LSB_HALF));
_Data[nADChannel][_DataNumber[nADChannel]]=dVolt;
_DataNumber[nADChannel]+=1;
nADChannel++;
if(nADChannel > m_ADPara.LastChannel)
{
nADChannel = m_ADPara.FirstChannel;
}
}
break;
}
case E_ART_PCI8622_SAMPLE_HALF:
case E_ART_PCI8622_SAMPLE_HALF_SEQ:
case E_ART_PCI8622_SAMPLE_HALF_TRIGCLK:
{
PCI8622_STATUS_AD ADStatus;
LONG nReadSizeWords = 4096;
LONG nRetSizeWords(0);
m_SegmentID=0;
if(!PCI8622_GetDevStatusProAD(m_hDevice, &ADStatus))
{
rStatus=FALSE;
StopSampleData();
}
if(ADStatus.bHalf)
{
break; // 若板载FIFO存储器数据量达到半满以上,则退出状态查询,开始读取半满数据
}
if(!PCI8622_ReadDeviceProAD_Half(m_hDevice, ADBuffer[m_SegmentID], nReadSizeWords, &nRetSizeWords))
{
rStatus=FALSE;
StopSampleData();
}
else
{
m_SegmentID=0;
LONG nReadSizeWords = 4096;
LONG nRetSizeWords(0);
PCI8622_ReadDeviceProAD_Npt(m_hDevice, ADBuffer[0], nReadSizeWords, &nRetSizeWords);
nADChannel = m_ADPara.FirstChannel;
TRACE1("[PCI8622_ReadDeviceProAD_Npt] Retsize:%d.\r\n",nRetSizeWords);
for(Index=0; Index<nRetSizeWords; Index++)
TRACE1("[PCI8622_ReadDeviceProAD_Half] Retsize:%d.\r\n",nRetSizeWords);
for(Index=0; Index<64; Index++)
{
ADData = ((ADBuffer[m_SegmentID][Index]));
// 将原码转换为电压值
@@ -308,11 +432,18 @@ BOOL CART_PCI8622::GetData(double (*_Data)[HALF_SIZE_WORDS],int* _DataNumber)
nADChannel = m_ADPara.FirstChannel;
}
}
break;
}
}
default:
{
break;
}
}
m_StopedCapture=FALSE;
m_StopedSample=FALSE;
#else
UNREFERENCED_PARAMETER(_Data);
UNREFERENCED_PARAMETER(_DataNumber);
#endif //_RELEASE_FULL_VERSION
return rStatus;