📄 dualdma.c
字号:
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
for (i=0 ; i < gwNumChl ; i++)
{
if (!gwGainList)
{
gwGainCde[i] = DevFeatures.glGainList[gwGainCode].usGainCde; // no gain list
}
else
{
temp = gwGain[i];
gwGainCde[i] = DevFeatures.glGainList[temp].usGainCde;
}
}
// Step 7: Start DMA transfer
ptFAIDualDmaScanStart.TrigSrc = gwExtTrig;
ptFAIDualDmaScanStart.StartChan = gwStartChl;
ptFAIDualDmaScanStart.NumChans = gwNumChl;
ptFAIDualDmaScanStart.GainList = &gwGainCde[0];
ptFAIDualDmaScanStart.SampleRate = gdwPacerRate;
ptFAIDualDmaScanStart.count = gulConvNum;
ptFAIDualDmaScanStart.BufferA = (USHORT far *)pBuffer;
ptFAIDualDmaScanStart.BufferB = (USHORT far *)pBuffer;
if ((ErrCde = DRV_FAIDualDmaScanStart(DriverHandle,
(LPT_FAIDualDmaScanStart)&ptFAIDualDmaScanStart)) != 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;
if (gwEvtFlag)
hThreadHandle = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) UserThread,
0, 0, (LPDWORD)&dwThreadID);
Sleep(0);
EnableMenuItem(hMenu, IDM_RUN, MF_DISABLED | MF_BYCOMMAND);
// Enable stop and status buttons
EnableWindow(hwndStopButton, TRUE);
EnableWindow(hwndStatusButton, TRUE);
return 0;
//end IDM_RUN
case IDC_STOPBUTTON:
// Close thread
bThreadStatus = GetExitCodeThread(hThreadHandle, &dwExitCode);
if ((dwExitCode== (DWORD)STILL_ACTIVE) && (bThreadStatus))
{
TerminateThread(hThreadHandle, 0);
CloseHandle(hThreadHandle);
CloseHandle(hEvent);
Sleep(0);
}
// Disable stop and status buttons
EnableWindow(hwndStopButton, FALSE);
EnableWindow(hwndStatusButton, FALSE);
// Step 1: Stop A/D conversion for high speed
if ((ErrCde = DRV_FAIStop(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);
return 0;
}
// Step 2: Get real voltage of buffer A from driver memory buffer
ptFAITransfer.ActiveBuf = 0;
ptFAITransfer.DataType = gwDataType;
ptFAITransfer.start = 0;
ptFAITransfer.count = gulConvNum;
ptFAITransfer.overrun = &gwOverrun;
ptFAITransfer.DataBuffer = (LPVOID)hUserA;
if ((ErrCde = DRV_FAITransfer(DriverHandle,
(LPT_FAITransfer)&ptFAITransfer)) != 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 3: Get real voltage of bufferB from driver memory buffer
ptFAITransfer.ActiveBuf = 1;
ptFAITransfer.DataType = gwDataType;
ptFAITransfer.start = 0;
ptFAITransfer.count = gulConvNum;
ptFAITransfer.overrun = &gwOverrun;
ptFAITransfer.DataBuffer = (LPVOID)hUserB;
if ((ErrCde = DRV_FAITransfer(DriverHandle,
(LPT_FAITransfer)&ptFAITransfer)) != 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 data
DialogBox (hInstance, MAKEINTRESOURCE(IDD_DATA),
hWnd, lpfnShowDataDlgProc) ;
// Step 3: Free buffer
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
// Step 4: Close driver
DRV_DeviceClose((LONG far *)&DriverHandle);
EnableMenuItem(hMenu, IDM_RUN, MF_ENABLED | MF_BYCOMMAND);
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;
}
else
{ // Display the status of the A/D conversion
sprintf(szDest, "Cyclic Counts: %d\n", gwCyclicCount);
if (gwActiveBuf)
strcpy(szTemp, "Active Buffer: B\n");
else
strcpy(szTemp, "Active Buffer: A\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())
{
// Check message
ptCheckEvent.EventType = &usEventType;
ptCheckEvent.Milliseconds = 5000;
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 terminate event
if (usEventType & ADS_EVT_TERMINATED)
{
adTerminateEvent();
return ;
}
}
MessageBox(hWnd,"Never Get Any Event !","Thread Message",MB_OK);
}
//------------------------------------------------------------------
void adInterruptEvent()
{
return;
}
//------------------------------------------------------------------
void adBufChangeEvent()
{
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,"Thread Message",MB_OK);
return ;
}
if (gwHalfReady == 1) // buffer A ready
{
ptFAITransfer.ActiveBuf = 0; // read buffer A
ptFAITransfer.DataType = gwDataType;
ptFAITransfer.start = 0;
ptFAITransfer.count = gulConvNum/2;
ptFAITransfer.overrun = &gwOverrun;
ptFAITransfer.DataBuffer = hUserA;
if ((ErrCde = DRV_FAITransfer(DriverHandle,
(LPT_FAITransfer)&ptFAITransfer)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
}
else if (gwHalfReady == 2) // buffer B ready
{
ptFAITransfer.ActiveBuf = 1; // buffer B
ptFAITransfer.DataType = gwDataType;
ptFAITransfer.start = gulConvNum/2;
ptFAITransfer.count = gulConvNum/2;
ptFAITransfer.overrun = &gwOverrun;
ptFAITransfer.DataBuffer = hUserB;
if ((ErrCde = DRV_FAITransfer(DriverHandle,
(LPT_FAITransfer)&ptFAITransfer)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
}
gwCyclicCount ++;
return;
}
//------------------------------------------------------------------
void adOverrunEvent()
{
// clear overrun
if ((ErrCde = DRV_ClearOverrun(DriverHandle)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
return;
}
//------------------------------------------------------------------
void adTerminateEvent()
{
// Disable stop and status buttons
EnableWindow(hwndStopButton, FALSE);
EnableWindow(hwndStatusButton, FALSE);
// Stop A/D conversion
if ((ErrCde = DRV_FAIStop(DriverHandle)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
// Get real voltage of buffer from driver
ptFAITransfer.ActiveBuf = 0; // read buffer A
ptFAITransfer.DataType = gwDataType;
ptFAITransfer.start = 0;
ptFAITransfer.count = gulConvNum;
ptFAITransfer.overrun = &gwOverrun;
ptFAITransfer.DataBuffer = (LPVOID)hUserA;
if ((ErrCde = DRV_FAITransfer(DriverHandle,
(LPT_FAITransfer)&ptFAITransfer)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
// Get real voltage of buffer from driver
ptFAITransfer.ActiveBuf = 1; // read buffer B
ptFAITransfer.DataType = gwDataType;
ptFAITransfer.start = 0;
ptFAITransfer.count = gulConvNum;
ptFAITransfer.overrun = &gwOverrun;
ptFAITransfer.DataBuffer = (LPVOID)hUserB;
if ((ErrCde = DRV_FAITransfer(DriverHandle,
(LPT_FAITransfer)&ptFAITransfer)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
// Display data
DialogBox (hInstance, MAKEINTRESOURCE(IDD_DATA),
hWnd, lpfnShowDataDlgProc) ;
// Free buffer
GlobalUnlock(hUserBufA);
GlobalFree(hUserBufA);
GlobalUnlock(hUserBufB);
GlobalFree(hUserBufB);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
// Close driver
DRV_DeviceClose((LONG far *)&DriverHandle);
EnableMenuItem(hMenu, IDM_RUN, MF_ENABLED | MF_BYCOMMAND);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -