📄 didma.c
字号:
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// 32DI(0)/32DO(1)/ 16 DIO(2) / 8DIO(3)
switch( gdwDataWidth )
{
case 3:
dwCount = dwUserBufferSize;
break;
case 2:
dwCount = dwUserBufferSize / 2;
break;
default:
dwCount = dwUserBufferSize / 4;
break;
}
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DiPatternMatchValue, &gdwPatternMatchValue, sizeof(DWORD));
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_CounterCountValue, &gdwCounterValue, 3*sizeof(DWORD));
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DiOperationMode, &gdwOperationMode, sizeof(DWORD));
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DioFdioDirection, &gdwDataWidth, sizeof(DWORD));
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DiStartMethod, &gdwDIStartMode, sizeof(DWORD));
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DiStopMethod, &gdwDIStopMode, sizeof(DWORD));
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DiPacerSource, &gdwDITriggerSource, sizeof(DWORD));
if( BD_MIC3755 == gdwBoardId )
{
ErrCde = DRV_DeviceSetProperty(DriverHandle, CFG_DiTransferRequestMode, &gdwDmaMode, sizeof(DWORD));
}
if (ErrCde != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
// GlobalFree( hUserBuf );
// Decommit first, then release the memory
VirtualFree( hUserBuf, dwUserBufferSize, MEM_DECOMMIT );
VirtualFree( hUserBuf, 0, MEM_RELEASE);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
// Step 5: Start fast DI
ErrCde = DRV_FDIStart(
DriverHandle, //Device handle
gdwCyclicMode, //Cyclic(1)/non cyclic
dwCount, //Data counts
hUserBuf ); //Data buffer.
if (ErrCde != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
// GlobalFree( hUserBuf );
// Decommit first, then release the memory
VirtualFree( hUserBuf, dwUserBufferSize, MEM_DECOMMIT );
VirtualFree( hUserBuf, 0, MEM_RELEASE);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
hThreadHandle = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) UserThread,
0, 0, (LPDWORD)&dwThreadID);
bThreadloop = TRUE;
Sleep(0);
EnableMenuItem(hMenu, IDM_RUN, MF_DISABLED | MF_BYCOMMAND);
// Enable stop and status buttons
if( gdwCyclicMode )
{
EnableWindow( hwndStatusButton, TRUE );
EnableWindow( hwndStopButton, TRUE );
}
else
{
EnableWindow( hwndStatusButton, FALSE );
EnableWindow( hwndStopButton, TRUE );
}
return 0;
//end IDM_RUN
case IDC_STOPBUTTON:
{
//BOOL bflag = TRUE;
// Close thread
//bThreadloop = FALSE;
//Sleep(100);
ErrCde = DRV_FDIStop(DriverHandle);
if (ErrCde != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return 0;
}
// stop fdi function
/*adTerminateEvent();
EnableWindow(hwndStopButton, FALSE);
EnableWindow(hwndStatusButton, FALSE);
// Step 3: Free buffer
// GlobalFree(hUserBuf);
// Decommit first, then release the memory
VirtualFree( hUserBuf, (DWORD)(Mega * pow((double)2, (double)gdwUserBufferSize)), MEM_DECOMMIT );
VirtualFree( hUserBuf, 0, MEM_RELEASE);
// Step 4: Close driver
if ( DriverHandle )
{
DRV_DeviceClose((LONG far *)&DriverHandle);
}
EnableMenuItem(hMenu, IDM_RUN, MF_ENABLED | MF_BYCOMMAND);
*/
return 0;
}
case IDC_STATUSBUTTON:
{
ErrCde = DRV_FDICheck( DriverHandle, &dwFdiStatus, &dwRetrieved);
// Display the status of the A/D conversion
sprintf(szDest, "Cyclic Counts: %d\n", gdwDIBufferChangeCounter / 2);
if ( dwFdiStatus & 0x1 ) // Running
{
strcpy(szTemp, "Running\n");
}
else // Stopped
{
strcpy(szTemp, "FDI: Stopped\n");
}
strcat(szDest, szTemp);
dwUserBufferSize = (DWORD)(Mega * pow((double)2, (double)gdwUserBufferSize));
// 32DI(0)/32DO(1)/ 16 DIO(2) / 8DIO(3)
switch( gdwDataWidth )
{
case 3:
dwCount = dwUserBufferSize;
break;
case 2:
dwCount = dwUserBufferSize / 2;
break;
default:
dwCount = dwUserBufferSize / 4;
break;
}
ratio = 100.0 * dwRetrieved / dwCount;
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_CLOSE:
if( IsWindowEnabled(hwndStopButton))
{
MessageBox(hWnd,"The program is running, please push the stop button to stop. ",
"Close", MB_ICONEXCLAMATION | MB_ICONWARNING);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return ((LONG)NULL);
}
//------------------------------------------------------------------
void UserThread()
{
USHORT usEventType;
gdwDIBufferChangeCounter = 0;
gdwDIOverRunCounter = 0;
gdwDITerminateCounter = 0;
hdc = GetDC( hWnd );
GetClientRect( hWnd, &rect );
InvalidateRect( hWnd, NULL, TRUE );
UpdateWindow( hWnd );
while(bThreadloop)
{
// Check message
ptCheckEvent.EventType = &usEventType;
ptCheckEvent.Milliseconds = gulOverrunTime;
bThreadflag = TRUE;
DRV_CheckEvent(DriverHandle,(LPT_CheckEvent)&ptCheckEvent);
if ( usEventType == ADS_EVT_DI_LOBUFREADY ) // Driver finish the fill low buffer data
{
DRV_ClearFlag( DriverHandle, ADS_EVT_DI_OVERRUN);
sprintf(szBuffer,"%s","Transfer Buffer = Low half buffer ");
gdwDIBufferChangeCounter++;
}
else if( usEventType == ADS_EVT_DI_HIBUFREADY )
{
DRV_ClearFlag( DriverHandle, ADS_EVT_DI_OVERRUN);
sprintf(szBuffer,"%s","Transfer Buffer = High half buffer ");
gdwDIBufferChangeCounter++;
}
else if ( usEventType == ADS_EVT_DI_TERMINATED )
{
gdwDITerminateCounter++;
bThreadloop = FALSE; // Stop the thread
bThreadflag = FALSE;
sprintf( szCounter, "Buffer change Count = %4d\n", gdwDIBufferChangeCounter );
TextOut( hdc, 300, 70, szCounter, 26 );
sprintf( szCounter, "Overrun Count = %4d\n", gdwDIOverRunCounter );
TextOut( hdc, 300, 90, szCounter, 20 );
sprintf( szCounter, "Terminate Count = %4d\n",gdwDITerminateCounter );
TextOut( hdc, 300, 110, szCounter, 22 );
UpdateWindow( hWnd );
adTerminateEvent();
EnableWindow(hwndStopButton, FALSE);
EnableWindow(hwndStatusButton, FALSE);
}
else if ( usEventType == ADS_EVT_DI_OVERRUN )
{
DRV_ClearFlag( DriverHandle, ADS_EVT_DI_OVERRUN);
gdwDIOverRunCounter++;
}
bThreadflag = FALSE;
sprintf( szCounter, "Buffer change Count = %4d\n", gdwDIBufferChangeCounter );
TextOut( hdc, 300, 70, szCounter, 26 );
sprintf( szCounter, "Overrun Count = %4d\n", gdwDIOverRunCounter );
TextOut( hdc, 300, 90, szCounter, 20 );
sprintf( szCounter, "Terminate Count = %4d\n",gdwDITerminateCounter );
TextOut( hdc, 300, 110, szCounter, 22 );
UpdateWindow( hWnd );
}
bThreadflag = FALSE;
ReleaseDC( hWnd, hdc );
}
//-----------------------------------------------------------------------------
void adTerminateEvent()
{
if ( !DriverHandle )
{
return;
}
ErrCde = DRV_FDIStop(DriverHandle);
if (ErrCde != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
return ;
}
//
// Disable open Event
//
ptEnableEvent.Enabled = 0;
ptEnableEvent.EventType = ADS_EVT_DI_OVERRUN; // Overrun event
DRV_EnableEvent(DriverHandle, &ptEnableEvent);
ptEnableEvent.EventType = ADS_EVT_DI_LOBUFREADY; // Low buffer ready event
DRV_EnableEvent(DriverHandle, &ptEnableEvent);
ptEnableEvent.EventType = ADS_EVT_DI_HIBUFREADY; // High buffer ready event.
DRV_EnableEvent(DriverHandle, &ptEnableEvent);
ptEnableEvent.EventType = ADS_EVT_DI_TERMINATED; // Fast DI function terminated
DRV_EnableEvent(DriverHandle, &ptEnableEvent);
ErrCde = DRV_DeviceClose(&DriverHandle);
if (ErrCde != 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
// GlobalFree(hUserBuf);
// Decommit first, then release the memory
VirtualFree( hUserBuf, (DWORD)(Mega * pow((double)2, (double)gdwUserBufferSize)), MEM_DECOMMIT );
VirtualFree( hUserBuf, 0, MEM_RELEASE);
ErrCde = GetLastError();
// Close driver
if ( DriverHandle )
{
DRV_DeviceClose((LONG far *)&DriverHandle);
}
EnableMenuItem(hMenu, IDM_RUN, MF_ENABLED | MF_BYCOMMAND);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -