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

📄 dualdma.c

📁 Advantech driver Demo: Analog output with DMA Data Transfer!
💻 C
📖 第 1 页 / 共 4 页
字号:
                DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);
                DRV_DeviceClose((LONG far *)&DriverHandle);
                return 0;
            }

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

            // Step 7: Start DMA transfer
            ptFAIDualDmaScanStart.TrigSrc    = gwExtTrig;
            ptFAIDualDmaScanStart.StartChan  = gwStartChl;
            ptFAIDualDmaScanStart.NumChans   = gwNumChl;
            ptFAIDualDmaScanStart.GainList   = &gwGainCde[0];
            ptFAIDualDmaScanStart.SampleRate = gdwPacerRate;
            ptFAIDualDmaScanStart.count  = gulConvNum;
            ptFAIDualDmaScanStart.BufferA = (USHORT far *)pBuffer;
            ptFAIDualDmaScanStart.BufferB = (USHORT far *)pBuffer;

            if ((ErrCde = DRV_FAIDualDmaScanStart(DriverHandle,
                (LPT_FAIDualDmaScanStart)&ptFAIDualDmaScanStart)) != 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;

            if (gwEvtFlag)
                hThreadHandle = CreateThread(0, 0,
                (LPTHREAD_START_ROUTINE) UserThread,
                0, 0, (LPDWORD)&dwThreadID);

            Sleep(0);

            EnableMenuItem(hMenu, IDM_RUN, MF_DISABLED | MF_BYCOMMAND);

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

            return 0;
            //end IDM_RUN

        case IDC_STOPBUTTON:

            // Close thread
            bThreadStatus = GetExitCodeThread(hThreadHandle, &dwExitCode);
            if ((dwExitCode== (DWORD)STILL_ACTIVE) && (bThreadStatus))
            {
                TerminateThread(hThreadHandle, 0);
                CloseHandle(hThreadHandle);
                CloseHandle(hEvent);
                Sleep(0);
            }

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

            EnableWindow(hwndStatusButton, FALSE);

            // Step 1: Stop A/D conversion for high speed
            if ((ErrCde = DRV_FAIStop(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);
                return 0;
            }

            // Step 2: Get real voltage of buffer A from driver memory buffer
            ptFAITransfer.ActiveBuf = 0;
            ptFAITransfer.DataType = gwDataType;
            ptFAITransfer.start    = 0;
            ptFAITransfer.count    = gulConvNum;
            ptFAITransfer.overrun  = &gwOverrun;
            ptFAITransfer.DataBuffer = (LPVOID)hUserA;

            if ((ErrCde = DRV_FAITransfer(DriverHandle,
                (LPT_FAITransfer)&ptFAITransfer)) != 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 3: Get real voltage of bufferB from driver memory buffer
            ptFAITransfer.ActiveBuf = 1;
            ptFAITransfer.DataType = gwDataType;
            ptFAITransfer.start    = 0;
            ptFAITransfer.count    = gulConvNum;
            ptFAITransfer.overrun  = &gwOverrun;
            ptFAITransfer.DataBuffer = (LPVOID)hUserB;

            if ((ErrCde = DRV_FAITransfer(DriverHandle,
                (LPT_FAITransfer)&ptFAITransfer)) != 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 data
            DialogBox (hInstance, MAKEINTRESOURCE(IDD_DATA),
                hWnd, lpfnShowDataDlgProc) ;

            // Step 3: Free buffer
            GlobalUnlock(hUserBufA);
            GlobalFree(hUserBufA);
            GlobalUnlock(hUserBufB);
            GlobalFree(hUserBufB);
            DRV_FreeDMABuffer(DriverHandle, (LPARAM)&pBuffer);

            // Step 4: Close driver
            DRV_DeviceClose((LONG far *)&DriverHandle);

            EnableMenuItem(hMenu, IDM_RUN, MF_ENABLED | MF_BYCOMMAND);

            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;
            }
            else
            {   // Display the status of the A/D conversion
                sprintf(szDest, "Cyclic Counts: %d\n", gwCyclicCount);
                if (gwActiveBuf)
                   strcpy(szTemp, "Active Buffer: B\n");
                else
                   strcpy(szTemp, "Active Buffer: A\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())
    {
        // 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_INTERRUPT)
            adInterruptEvent();

        // Process buffer change event
        if (usEventType & ADS_EVT_BUFCHANGE)
            adBufChangeEvent();

        // Process overrun event
        if (usEventType & ADS_EVT_OVERRUN)
            adOverrunEvent();

        // Process terminate event
        if (usEventType & ADS_EVT_TERMINATED)
        {
            adTerminateEvent();
            return ;
        }
    }

    MessageBox(hWnd,"Never Get Any Event !","Thread Message",MB_OK);
}

//------------------------------------------------------------------
void adInterruptEvent()
{
    return;
}

//------------------------------------------------------------------
void adBufChangeEvent()
{
    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,"Thread Message",MB_OK);
        return ;
    }

    if (gwHalfReady == 1)  // buffer A ready
    {
        ptFAITransfer.ActiveBuf = 0;   // read buffer A
        ptFAITransfer.DataType = gwDataType;
        ptFAITransfer.start    = 0;
        ptFAITransfer.count    = gulConvNum/2;
        ptFAITransfer.overrun  = &gwOverrun;
        ptFAITransfer.DataBuffer = hUserA;

        if ((ErrCde = DRV_FAITransfer(DriverHandle,
            (LPT_FAITransfer)&ptFAITransfer)) != 0)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
            return ;
        }
    }
    else if (gwHalfReady == 2) // buffer B ready
    {
        ptFAITransfer.ActiveBuf = 1;   // buffer B
        ptFAITransfer.DataType = gwDataType;
        ptFAITransfer.start    = gulConvNum/2;
        ptFAITransfer.count    = gulConvNum/2;
        ptFAITransfer.overrun  = &gwOverrun;
        ptFAITransfer.DataBuffer = hUserB;

        if ((ErrCde = DRV_FAITransfer(DriverHandle,
            (LPT_FAITransfer)&ptFAITransfer)) != 0)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
            return ;
        }

    }

    gwCyclicCount ++;

    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()
{
    // Disable stop and status buttons
    EnableWindow(hwndStopButton, FALSE);
    EnableWindow(hwndStatusButton, FALSE);

    // Stop A/D conversion
    if ((ErrCde = DRV_FAIStop(DriverHandle)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
        return ;
    }

    // Get real voltage of buffer from driver
    ptFAITransfer.ActiveBuf = 0;   // read buffer A
    ptFAITransfer.DataType = gwDataType;
    ptFAITransfer.start    = 0;
    ptFAITransfer.count    = gulConvNum;
    ptFAITransfer.overrun  = &gwOverrun;
    ptFAITransfer.DataBuffer = (LPVOID)hUserA;

    if ((ErrCde = DRV_FAITransfer(DriverHandle,
        (LPT_FAITransfer)&ptFAITransfer)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        MessageBox(hWnd,(LPCSTR)szErrMsg,"Thread Message",MB_OK);
        return ;
    }

    // Get real voltage of buffer from driver
    ptFAITransfer.ActiveBuf = 1;   // read buffer B
    ptFAITransfer.DataType = gwDataType;
    ptFAITransfer.start    = 0;
    ptFAITransfer.count    = gulConvNum;
    ptFAITransfer.overrun  = &gwOverrun;
    ptFAITransfer.DataBuffer = (LPVOID)hUserB;

    if ((ErrCde = DRV_FAITransfer(DriverHandle,
        (LPT_FAITransfer)&ptFAITransfer)) != 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
    GlobalUnlock(hUserBufA);
    GlobalFree(hUserBufA);
    GlobalUnlock(hUserBufB);
    GlobalFree(hUserBufB);
    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 + -