📄 counter.c
字号:
if (hThreadHandle != NULL){
GetExitCodeThread(hThreadHandle, &dwExitCode );
if( dwExitCode == STILL_ACTIVE ){
TerminateThread( hThreadHandle, dwExitCode );
hThreadHandle = NULL;
}
}
//
// counter reset
//
if (DriverHandle != 0){
if ((ErrCde = DRV_CounterReset(DriverHandle,
(LPARAM)gwChannel)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
}
bRun = FALSE;
if ( gwIntFlag )
{
ptEnableEvent.Enabled = FALSE;
ptEnableEvent.Count = gwCount;
if( ErrCde = DRV_EnableEvent( DriverHandle,
(LPT_EnableEvent)&ptEnableEvent ) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
return TRUE;
}
}
DRV_DeviceClose((LONG far *)&DriverHandle);
DriverHandle = 0;
}
//
// reset menu item status
//
EnableMenuItem(hMenu, IDM_STOP, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_START, MF_BYCOMMAND | MF_ENABLED);
return 0;
case IDM_START :
//
// Open Device
//
if (gnNumOfSubdevices == 0)
ErrCde = DRV_DeviceOpen(
DeviceList[gwDevice].dwDeviceNum,
(LONG far *)&DriverHandle);
else
ErrCde = DRV_DeviceOpen(
SubDeviceList[gwSubDevice].dwDeviceNum,
(LONG far *)&DriverHandle);
if (ErrCde != SUCCESS)
{
strcpy(szErrMsg,"Device open error !");
MessageBox(hWnd,(LPCSTR)szErrMsg,"Device Open",MB_OK);
return 0;
}
//
// get number of counter channels
//
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;
}
// check number of counter channels
if (DevFeatures.usMaxTimerChl == 0)
{
MessageBox(hWnd,(LPCSTR)"No Counter Channel",
"Driver Message",MB_OK);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
//
// start counter
//
ptCounterConfig.usCounter = gwChannel;
ptCounterConfig.usClkSrc = gwClkSrc;
ptCounterConfig.usCountDirect = gwCntDirect;
ptCounterConfig.usCountEdge = gwCntEdge;
ptCounterConfig.usCountMode = gwCounterMode;
ptCounterConfig.usInitValue = (USHORT)g_usIniVal;
ptCounterConfig.usOutputEnable= gwOutputEnable;
ptCounterConfig.usOutputMode = gwOutputMode;
ptCounterConfig.usGateSrc = gwGateSrc;
ptCounterConfig.usGatePolarity= gwGatePolarity;
if((ErrCde = DRV_CounterConfig(DriverHandle,
(LPT_CounterConfig)&ptCounterConfig)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
return TRUE;
}
ptCounterEventStart.counter = gwChannel;
if((ErrCde = DRV_CounterEventStart(DriverHandle,
(LPT_CounterEventStart)&ptCounterEventStart)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
return TRUE;
}
switch ( gwChannel )
{
case 0:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT0;
}
break;
case 1:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT1;
}
break;
case 2:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT2;
}
break;
case 3:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT3;
}
break;
case 4:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT4;
}
break;
case 5:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT5;
}
break;
case 6:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT6;
}
break;
case 7:
{
ptEnableEvent.EventType = ADS_EVT_TERMINATE_CNT7;
}
break;
default :
break;
}
ptEnableEvent.Enabled = gwIntFlag;
ptEnableEvent.Count = gwCount;
if ( ErrCde = DRV_EnableEvent( DriverHandle,
(LPT_EnableEvent)&ptEnableEvent ) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
return TRUE;
}
if ( gwIntFlag )
{
gwStopFlag = 0;
hThreadHandle = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) UserThread,
0, 0, (LPDWORD)&dwThreadID);
bThreadloop = TRUE;
}
//
// enable Stop Menu item and disable the others
//
EnableMenuItem(hMenu, IDM_STOP, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_START, MF_BYCOMMAND | MF_GRAYED);
//
// Set the new timer type and start it up.
//
if (SetTimer(hWnd, 1, gwScanTime, NULL) == (UINT)NULL)
{
MessageBox(hWnd, "Couldn't create timer.", "Notice!",
MB_OK);
DRV_DeviceClose((LONG far *)&DriverHandle);
return 0;
}
bRun = TRUE;
gdwStartTime = GetTickCount();
gwOverrunCount = 0;
return 0;
}
return 0;
case WM_TIMER:
//
// Timer set to dispatch a WM_TIMER message has gone off.
//
//
// check if timer is overrun
//
dwCurrentTime = GetTickCount();
gdwElapseTime = gdwElapseTime + (DWORD)gwScanTime;
dwErrorTime = dwCurrentTime - gdwElapseTime - gdwStartTime;
if (dwErrorTime > (DWORD)40) // maximum 40 ms scan time
{
gdwElapseTime = dwCurrentTime - gdwStartTime;
gwOverrunCount ++;
if (gwOverrunCount >= 10)
{
bTimerOverrun = TRUE;
gwOverrunCount = 0;
}
else
bTimerOverrun = FALSE;
}
else
{
bTimerOverrun = FALSE;
gwOverrunCount = 0;
}
//
// read count
//
ptCounterEventRead.counter = gwChannel;
ptCounterEventRead.overflow = (USHORT far *)&gwOverflow;
ptCounterEventRead.count = (ULONG far *)&gdwReading;
if ((ErrCde = DRV_CounterEventRead(DriverHandle,
(LPT_CounterEventRead)&ptCounterEventRead)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
KillTimer(hWnd, 1);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
DRV_DeviceClose((LONG far *)&DriverHandle);
return TRUE;
}
//
// Display Data
//
hdc = GetDC(hWnd);
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
wsprintf((LPSTR)szBuffer, "Counter Reading = %8lu", gdwReading);
DrawText(hdc, szBuffer, -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
ReleaseDC(hWnd, hdc);
return 0;
case WM_DESTROY:
{
if ( bThreadloop == TRUE )
{
bThreadloop = FALSE;
}
if (bRun == TRUE)
{
KillTimer(hWnd, 1);
// counter reset
if( (ErrCde = DRV_CounterReset(DriverHandle,
(LPARAM)gwChannel)) != 0)
{
DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
MessageBox(hWnd,(LPCSTR)szErrMsg, "Driver Message", MB_OK);
}
DRV_DeviceClose((LONG far *)&DriverHandle);
}
PostQuitMessage(0);
}
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return ((LONG)NULL);
}
// ------------------------------------------------------------------
// UserThread
//
// -------------------------------------------------------------------
void UserThread()
{
USHORT usEventType;
LONG ErrCde;
while(bThreadloop)
{
// Check message
ptCheckEvent.EventType = &usEventType;
ptCheckEvent.Milliseconds = INFINITE;
bThreadflag = TRUE;
if ((ErrCde = DRV_CheckEvent(DriverHandle,
(LPT_CheckEvent)&ptCheckEvent)) != 0)
{
MessageBox(hMainWnd, "Check Event Error !", "Thread Message", MB_OK);
bThreadloop = FALSE;
bThreadflag = FALSE;
return ;
}
// Process interrupt event
if ( (usEventType ==ADS_EVT_TERMINATE_CNT0 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 0 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if ( usEventType == ADS_EVT_TERMINATE_CNT0 )
{
MessageBox( hMainWnd, "Counter0 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT1 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 1 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT1 )
{
MessageBox( hMainWnd, "Counter1 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT2 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 2 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT2 )
{
MessageBox( hMainWnd, "Counter2 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT3 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 3 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT3 )
{
MessageBox( hMainWnd, "Counter3 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT4 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 4 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT4 )
{
MessageBox( hMainWnd, "Counter4 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT5 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 5 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT5 )
{
MessageBox( hMainWnd, "Counter5 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT6 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 6 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT6 )
{
MessageBox( hMainWnd, "Counter6 Terminal Event Occured !","Interrupt Message",MB_OK);
}
if ( (usEventType == ADS_EVT_TERMINATE_CNT7 )&&(gwStopFlag == 1))
{
MessageBox( hMainWnd,"Counter 7 Stop!","Counter Message",MB_OK);
gwStopFlag = 0;
}
else if (usEventType == ADS_EVT_TERMINATE_CNT7 )
{
MessageBox( hMainWnd, "Counter7 Terminal Event Occured !","Interrupt Message",MB_OK);
}
bThreadflag = FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -