📄 dadmabm.c
字号:
strcpy(szTemp, "Buffer : not ready\n");
else if (gwHalfReady == 1)
strcpy(szTemp, "Buffer : half ready\n");
else if (gwHalfReady == 2)
strcpy(szTemp, "Buffer : full 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:
if (bThreadloop) {
// Step 1: Stop D/A conversion for high speed
if ((ErrCde = DRV_FAOTerminate(DriverHandle)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
GlobalUnlock(hBuf); GlobalFree(hBuf);
GlobalUnlock(hVoltageBuf); GlobalFree(hVoltageBuf);
GlobalUnlock(hBinaryBuf); GlobalFree(hBinaryBuf);
DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// If the Terminate event is not enabled, destroy the UserThread
// manully
if (!gwEvtFlag)
{
if (GetExitCodeThread(hThreadHandle, &dwExitCode)){
if (STILL_ACTIVE == dwExitCode){
TerminateThread(hThreadHandle, 0);
}
}else{
MessageBox(hWnd, "Termiante Check Event Thread fail","Error", MB_OK);
}
adTerminateEvent();
}
// Step 2: Wait untill the UserThread exit
WaitForSingleObject(hThreadHandle, INFINITE);
CloseHandle(hThreadHandle);
// Step 3: Close driver
}
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return ((LONG)NULL);
}
void SetRealBuffer(float far *lpBuf, long num, LPSWAVE lpWave)
{
int i, r, half;
float slope;
switch (lpWave->wWaveform)
{
case WAVE_SINE:
for (i = 0; i < num; i ++)
{
*(lpBuf+i) = (float)(lpWave->fMagnitude
* sin(6.28318*(double)i/(double)lpWave->wPeriod)
+ lpWave->fOffset);
}
break;
case WAVE_TRIANGLE:
slope = lpWave->fMagnitude * 4.0f / (float)lpWave->wPeriod;
for (i = 0; i < num; i ++)
{
r = i % lpWave->wPeriod;
half = (int)((float)lpWave->wPeriod / 2.0f);
if (r <= half)
*(lpBuf + i) = slope * r - lpWave->fMagnitude
+ lpWave->fOffset;
else
*(lpBuf + i) = slope * (lpWave->wPeriod - r)
- lpWave->fMagnitude + lpWave->fOffset;
}
break;
case WAVE_SQUARE:
for (i = 0; i < num; i ++)
{
r = i % lpWave->wPeriod;
half = (int)((float)lpWave->wPeriod / 2.0f);
if (r <= half)
*(lpBuf + i) = lpWave->fOffset - lpWave->fMagnitude;
else
*(lpBuf + i) = lpWave->fOffset + lpWave->fMagnitude;
}
break;
case SINE_TRIANGLE:
{
ULONG x;
double y;
slope = lpWave->fMagnitude * 4.0f / (float)lpWave->wPeriod;
for (i = 0; i < num; i ++)
{
if(i%2)
{
modf(((double)i/2.0),(double *)&y);
y = y + 1;
r = ((USHORT)y) % lpWave->wPeriod;
half = (int)((float)lpWave->wPeriod / 2.0f);
if (r <= half)
*(lpBuf + i) = slope * r - lpWave->fMagnitude
+ lpWave->fOffset;
else
*(lpBuf + i) = slope * (lpWave->wPeriod - r)
- lpWave->fMagnitude + lpWave->fOffset;
}
else
{
x = i/2;
*(lpBuf+i) = (float)(lpWave->fMagnitude
* sin(6.28318*(double)x/(double)lpWave->wPeriod)
+ lpWave->fOffset);
}
}
break;
}
}
}
//------------------------------------------------------------------
void UserThread()
{
USHORT usEventType;
LONG ErrCde;
hdc = GetDC( hWnd );
GetClientRect( hWnd, &rect );
InvalidateRect( hWnd, NULL, TRUE );
UpdateWindow( hWnd );
gulIntCounter = 0;
gulBfChgCounter = 0;
while(bThreadloop)
{
// 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_AO_INTERRUPT)
adInterruptEvent();
// Process buffer change event
if (usEventType == ADS_EVT_AO_BUFCHANGE)
adBufChangeEvent();
// Process overrun event
if (usEventType == ADS_EVT_AO_UNDERRUN)
adOverrunEvent();
// Process terminate event
if (usEventType == ADS_EVT_AO_TERMINATED){
adTerminateEvent();
MessageBox(hWnd, "Terminated", "Message", MB_OK);
}
sprintf( szCounter, "Interrupt Counter = %4d\n", gulIntCounter );
TextOut( hdc, 300, 50, szCounter, 24 );
sprintf( szCounter, "Buffer change Counter = %4d\n", gulBfChgCounter );
TextOut( hdc, 300, 70, szCounter, 28 );
UpdateWindow( hWnd );
}
ReleaseDC( hWnd, hdc );
}
//------------------------------------------------------------------
void adInterruptEvent()
{
gulIntCounter++;
return;
}
//------------------------------------------------------------------
void adBufChangeEvent()
{
USHORT usWaveIndex;
LPSWAVE lpWave;
gulBfChgCounter++;
/*
usWaveIndex = (gwRepeatCount + 1) % 3;
switch (usWaveIndex)
{
case 0:
lpWave = &sWaveA;
break;
case 1:
lpWave = &sWaveB;
break;
case 2:
lpWave = &sWaveC;
break;
}
// Step 1: get status
ptFAOCheck.ActiveBuf = &gwActiveBuf;
ptFAOCheck.stopped = &gwStopped;
ptFAOCheck.CurrentCount = &gulRetrieved;
ptFAOCheck.overrun = &gwOverrun;
ptFAOCheck.HalfReady = &gwHalfReady;
if ((ErrCde = DRV_FAOCheck(DriverHandle,
(LPT_FAOCheck)&ptFAOCheck)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
// Set real voltage to first half buffer
SetRealBuffer(lpVoltageBuf, gulConvNum/2, lpWave);
// Step 2: call FAOScale for transfer voltage to binary data
ptFAOScale.VoltArray = lpVoltageBuf;
ptFAOScale.BinArray = lpBinaryBuf;
ptFAOScale.chan = gwStartChl;
ptFAOScale.count = gulConvNum/2;
if ((ErrCde = DRV_FAOScale(DriverHandle,
(LPT_FAOScale)&ptFAOScale)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
if (gwHalfReady == 2) // second half ready
{
// Step 3: call FAOLoad to pass data to driver
// ptFAOLoad.ActiveBuf = 0; // single buffer
// ptFAOLoad.DataBuffer = lpBinaryBuf;
// ptFAOLoad.start = 0;
// ptFAOLoad.count = gulConvNum;
// if ((ErrCde = DRV_FAOLoad(DriverHandle,
// (LPT_FAOLoad)&ptFAOLoad)) != 0)
// {
// DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
// MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
// return ;
// }
gwRepeatCount ++;
}*/
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()
{
bThreadloop = FALSE;
// Disable stop and status buttons
EnableWindow(hwndStopButton, FALSE);
EnableWindow(hwndStatusButton, FALSE);
// Free buffer
GlobalUnlock(hBuf);
GlobalFree(hBuf);
GlobalUnlock(hVoltageBuf);
GlobalFree(hVoltageBuf);
GlobalUnlock(hBinaryBuf);
GlobalFree(hBinaryBuf);
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 + -