📄 cdaddma.c
字号:
hMenu = GetMenu(hWnd);
switch(LOWORD(wParam))
{
// Show the dialog box of the input parameter
case IDM_SETTING :
DialogBox (hInstance, MAKEINTRESOURCE(IDD_SETTING),
hWnd, lpfnConfigDlgProc) ;
return 0;
// Show the dialog box for the range of data to display
case IDM_DISPLAY:
DialogBox (hInstance, MAKEINTRESOURCE(IDD_DISPLAY),
hWnd, lpfnDisplayDlgProc) ;
return 0;
case IDM_RUN :
// Step 1: Device open
ErrCde = DRV_DeviceOpen(dwDeviceNum, (LONG far *)&DriverHandle);
if (ErrCde != SUCCESS)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Device Open",MB_OK);
return 0;
}
// Step 2: Get device features
ptDevFeatures.buffer = (LPDEVFEATURES)&DevFeatures;
ptDevFeatures.size = sizeof(DEVFEATURES);
if ((ErrCde = DRV_DeviceGetFeatures(DriverHandle,
(LPT_DeviceGetFeatures)&ptDevFeatures)) != SUCCESS)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// Step 3: Allocate DMA buffer for DMA transfer
ptAllocateDMABuffer.CyclicMode = gwCyclicMode;
ptAllocateDMABuffer.RequestBufSize = gulConvNum * 2;
ptAllocateDMABuffer.ActualBufSize = &gwActualBufSize;
ptAllocateDMABuffer.buffer = &pBuffer;
if ((ErrCde = DRV_AllocateDMABuffer(DriverHandle,
(LPT_AllocateDMABuffer)&ptAllocateDMABuffer)) != SUCCESS)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// Step 4: Allocate buffer A memory for Voltage data or Raw data
if((hUserBufA=(FLOAT far *)GlobalAlloc(GHND,
sizeof(FLOAT) * gulConvNum)) == 0)
{
MessageBox(hWnd,"Not enough memory for buffer ",
"High Speed",MB_OK);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// Step 5: Allocate buffer B memory for Voltage data or Raw data
if((hUserBufB=(FLOAT far *)GlobalAlloc(GHND,
sizeof(FLOAT) * gulConvNum)) == 0)
{
MessageBox(hWnd,"Not enough memory for buffer ",
"High Speed",MB_OK);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
hUserA = (USHORT far *)GlobalLock(hUserBufA);
hUserB = (USHORT far *)GlobalLock(hUserBufB);
// Step 6: Enable event feature
ptEnableEvent.EventType = ADS_EVT_INTERRUPT |
ADS_EVT_BUFCHANGE |
ADS_EVT_TERMINATED |
ADS_EVT_OVERRUN |
ADS_EVT_WATCHDOG;
ptEnableEvent.Enabled = gwEvtFlag;
ptEnableEvent.Count = gwIntrCount;
if ((ErrCde = DRV_EnableEvent(DriverHandle,
(LPT_EnableEvent)&ptEnableEvent)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
for (i=0 ; i < gwNumChl ; i++)
{
// gain setting
if (!gwGainList)
{
gwGainCde[i] = DevFeatures.glGainList[gwGainCode].usGainCde; // no gain list
}
else
{
temp = gwGain[i];
gwGainCde[i] = DevFeatures.glGainList[temp].usGainCde;
}
// condition setting
if (!gwCondList)
gwCond[i] = gwCondition; // no condition list
// level setting
if (!gwLevelList)
{
gfLevel[i].fHigh = fHiLevel; // no level list
gfLevel[i].fLow = fLoLevel; // no level list
}
}
// Step 6: Configuration watchdog DMA transfer
ptFAIWatchdogConfig.StartChan = gwStartChl;
ptFAIWatchdogConfig.NumChans = gwNumChl;
ptFAIWatchdogConfig.GainList = &gwGainCde[0];
ptFAIWatchdogConfig.CondList = &gwCond[0];
ptFAIWatchdogConfig.LevelList = &gfLevel[0];
ptFAIWatchdogConfig.TrigMode = gwAcqMode + 1;
if ((ErrCde = DRV_FAIWatchdogConfig(DriverHandle,
(LPT_FAIWatchdogConfig)&ptFAIWatchdogConfig)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// Step 7: Start watchdog DMA transfer
ptFAIDmaWatchdogStart.TrigSrc = gwExtTrig;
ptFAIDmaWatchdogStart.SampleRate = gdwPacerRate;
ptFAIDmaWatchdogStart.count = gulConvNum;
ptFAIDmaWatchdogStart.BufferA = (USHORT far *)pBuffer;
ptFAIDmaWatchdogStart.BufferB = (USHORT far *)pBuffer;
if ((ErrCde = DRV_FAIDmaWatchdogStart(DriverHandle,
(LPT_FAIDmaWatchdogStart)&ptFAIDmaWatchdogStart)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
gwCyclicCount = 0;
gwTerminateflag = 0;
// if event feature is enabled , then create one thread.
if (gwEvtFlag)
{
hThreadHandle = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) UserThread,
0, 0, (LPDWORD)&dwThreadID);
}
EnableMenuItem(hMenu, IDM_RUN, MF_DISABLED | MF_BYCOMMAND);
// Enable stop and status buttons
EnableWindow(hwndStopButton, TRUE);
EnableWindow(hwndStatusButton, TRUE);
Sleep(0);
return 0;
//end IDM_RUN
case IDC_STOPBUTTON:
// Disable stop and status buttons
EnableWindow(hwndStopButton, FALSE);
EnableWindow(hwndStatusButton, FALSE);
// Stop A/D conversion for high speed
if ((ErrCde = DRV_FAITerminate(DriverHandle)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
}
if (gwEvtFlag == 0)
{
adTerminateEvent();
}
return 0;
case IDC_STATUSBUTTON:
// Get DMA transfer status
ptFAICheck.ActiveBuf = &gwActiveBuf;
ptFAICheck.stopped = &gwStopped;
ptFAICheck.retrieved = &gulRetrieved;
ptFAICheck.overrun = &gwOverrun;
ptFAICheck.HalfReady = &gwHalfReady;
if ((ErrCde = DRV_FAICheck(DriverHandle,
(LPT_FAICheck)&ptFAICheck)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// Display the status of the A/D conversion
sprintf(szDest, "Cyclic Counts: %d\n", gwCyclicCount);
if (gwHalfReady == 0)
strcpy(szTemp, "Buffer : not ready\n");
else if (gwHalfReady == 1)
strcpy(szTemp, "Buffer A ready\n");
else if (gwHalfReady == 2)
strcpy(szTemp, "Buffer B ready\n");
else
strcpy(szTemp, "Buffer : unknow \n");
strcat(szDest, szTemp);
ratio = 100.0 * gulRetrieved / gulConvNum;
szStr = fcvt((double)ratio, 0, &dec, &sign);
strcat(szDest, "Finish: ");
strcat(szDest, szStr);
strcat(szDest, "%...");
MessageBox(hWnd,(LPCSTR)szDest, "Check Status", MB_OK);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return ((LONG)NULL);
}
//------------------------------------------------------------------
void UserThread()
{
USHORT usEventType;
LONG ErrCde;
// DWORD TickValue;
// TickValue = GetTickCount();
// TickValue = TickValue + 500000;
// while(TickValue > GetTickCount())
while (1)
{
// Check message
ptCheckEvent.EventType = &usEventType;
ptCheckEvent.Milliseconds = 500000;
if ((ErrCde = DRV_CheckEvent(DriverHandle,
(LPT_CheckEvent)&ptCheckEvent)) != 0)
{
MessageBox(hWnd,"Check Event Error !","Thread Message",MB_OK);
return ;
}
// Process interrupt event
if (usEventType & ADS_EVT_INTERRUPT)
adInterruptEvent();
// Process buffer change event
if (usEventType & ADS_EVT_BUFCHANGE)
adBufChangeEvent();
// Process overrun event
if (usEventType & ADS_EVT_OVERRUN)
adOverrunEvent();
// Process watchdog event
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -