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

📄 cdaddma.c

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 C
📖 第 1 页 / 共 5 页
字号:

         hMenu = GetMenu(hWnd);

         switch(LOWORD(wParam))
          {
            // Show the dialog box of the input parameter
            case IDM_SETTING :

                DialogBox (hInstance, MAKEINTRESOURCE(IDD_SETTING),
                         hWnd, lpfnConfigDlgProc) ;
                return 0;

            // Show the dialog box for the range of data to display
            case IDM_DISPLAY:

                DialogBox (hInstance, MAKEINTRESOURCE(IDD_DISPLAY),
                         hWnd, lpfnDisplayDlgProc) ;

                return 0;

           case IDM_RUN :

             // Step 1: Device open
             ErrCde = DRV_DeviceOpen(dwDeviceNum, (LONG far *)&DriverHandle);
             if (ErrCde != SUCCESS)
             {
                 DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
                 MessageBox(hWnd,(LPCSTR)szErrMsg,"Device Open",MB_OK);
                 return 0;
             }

             // Step 2: Get device features
             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;
             }

             // Step 3: Allocate DMA buffer for DMA transfer
             ptAllocateDMABuffer.CyclicMode = gwCyclicMode;
             ptAllocateDMABuffer.RequestBufSize = gulConvNum * 2;
             ptAllocateDMABuffer.ActualBufSize = &gwActualBufSize;
             ptAllocateDMABuffer.buffer = &pBuffer;
             if ((ErrCde = DRV_AllocateDMABuffer(DriverHandle,
                 (LPT_AllocateDMABuffer)&ptAllocateDMABuffer)) != SUCCESS)
             {
                 DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
                 MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
                 DRV_DeviceClose((LONG far *)&DriverHandle);
                 return 0;
             }

             // Step 4: Allocate buffer A memory for Voltage data or Raw data
             if((hUserBufA=(FLOAT far *)GlobalAlloc(GHND,
                 sizeof(FLOAT) * gulConvNum)) == 0)
             {
                 MessageBox(hWnd,"Not enough memory for buffer ",
                     "High Speed",MB_OK);
                 DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
                 DRV_DeviceClose((LONG far *)&DriverHandle);
                 return 0;
             }

             // Step 5: Allocate buffer B memory for Voltage data or Raw data
             if((hUserBufB=(FLOAT far *)GlobalAlloc(GHND,
                 sizeof(FLOAT) * gulConvNum)) == 0)
             {
                 MessageBox(hWnd,"Not enough memory for buffer ",
                     "High Speed",MB_OK);
                 DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
                 DRV_DeviceClose((LONG far *)&DriverHandle);
                 return 0;
             }

             hUserA = (USHORT far *)GlobalLock(hUserBufA);
             hUserB = (USHORT far *)GlobalLock(hUserBufB);

             // Step 6: Enable event feature
             ptEnableEvent.EventType = ADS_EVT_INTERRUPT  |
                                       ADS_EVT_BUFCHANGE  |
                                       ADS_EVT_TERMINATED |
                                       ADS_EVT_OVERRUN    |
                                       ADS_EVT_WATCHDOG;
             ptEnableEvent.Enabled = gwEvtFlag;
             ptEnableEvent.Count   = gwIntrCount;

             if ((ErrCde = DRV_EnableEvent(DriverHandle,
                 (LPT_EnableEvent)&ptEnableEvent)) != 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;
             }

             for (i=0 ; i < gwNumChl ; i++)
             {
                 // gain setting
                 if (!gwGainList)
                 {
                     gwGainCde[i] = DevFeatures.glGainList[gwGainCode].usGainCde;      // no gain list
                 }
                 else
                 {
                     temp = gwGain[i];
                     gwGainCde[i] = DevFeatures.glGainList[temp].usGainCde;
                 }

                 // condition setting
                 if (!gwCondList)
                     gwCond[i] = gwCondition;   // no condition list

                 // level setting
                 if (!gwLevelList)
                 {
                     gfLevel[i].fHigh = fHiLevel;  // no level list
                     gfLevel[i].fLow  = fLoLevel;  // no level list
                 }
             }

             // Step 6: Configuration watchdog DMA transfer
             ptFAIWatchdogConfig.StartChan  = gwStartChl;
             ptFAIWatchdogConfig.NumChans   = gwNumChl;
             ptFAIWatchdogConfig.GainList   = &gwGainCde[0];
             ptFAIWatchdogConfig.CondList   = &gwCond[0];
             ptFAIWatchdogConfig.LevelList  = &gfLevel[0];
             ptFAIWatchdogConfig.TrigMode   = gwAcqMode + 1;

             if ((ErrCde = DRV_FAIWatchdogConfig(DriverHandle,
                 (LPT_FAIWatchdogConfig)&ptFAIWatchdogConfig)) != 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 7: Start watchdog DMA transfer
             ptFAIDmaWatchdogStart.TrigSrc    = gwExtTrig;
             ptFAIDmaWatchdogStart.SampleRate = gdwPacerRate;
             ptFAIDmaWatchdogStart.count      = gulConvNum;
             ptFAIDmaWatchdogStart.BufferA    = (USHORT far *)pBuffer;
             ptFAIDmaWatchdogStart.BufferB    = (USHORT far *)pBuffer;

             if ((ErrCde = DRV_FAIDmaWatchdogStart(DriverHandle,
                 (LPT_FAIDmaWatchdogStart)&ptFAIDmaWatchdogStart)) != 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;
			 gwTerminateflag = 0;

             // if event feature is enabled , then create one thread.
             if (gwEvtFlag)
             {
                 hThreadHandle = CreateThread(0, 0,
                     (LPTHREAD_START_ROUTINE) UserThread,
                     0, 0, (LPDWORD)&dwThreadID);
             }

             EnableMenuItem(hMenu, IDM_RUN, MF_DISABLED | MF_BYCOMMAND);

             // Enable stop and status buttons
             EnableWindow(hwndStopButton, TRUE);
             EnableWindow(hwndStatusButton, TRUE);

             Sleep(0);

             return 0;

            //end IDM_RUN

           case IDC_STOPBUTTON:                

                // Disable stop and status buttons
                EnableWindow(hwndStopButton, FALSE);
                EnableWindow(hwndStatusButton, FALSE);

                // Stop A/D conversion for high speed
                if ((ErrCde = DRV_FAITerminate(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);                   
                }
				if (gwEvtFlag == 0)
				{
					adTerminateEvent();
				}
                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;
                }

                // Display the status of the A/D conversion
                sprintf(szDest, "Cyclic Counts: %d\n", gwCyclicCount);
                if (gwHalfReady == 0)
                    strcpy(szTemp, "Buffer : not  ready\n");
                else if (gwHalfReady == 1)
                    strcpy(szTemp, "Buffer A ready\n");
                else if (gwHalfReady == 2)
                    strcpy(szTemp, "Buffer B 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:

         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())

    while (1)
    {
        // Check message
        ptCheckEvent.EventType = &usEventType;
        ptCheckEvent.Milliseconds = 500000;

        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 watchdog event
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -