⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 didma.c

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 C
📖 第 1 页 / 共 4 页
字号:
                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 + -