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

📄 addmabm.c

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 C
📖 第 1 页 / 共 5 页
字号:
 /*
 ******************************************************************************
 *  Program     : ADBMDMA.C                                                   *
 *  Description : Demo program for Windows NT with DMA data transfer          *
 *  Revision    : 2.1                                                         *
 *  Date        : 04/24/2003                  Advantech Beijing R&D Center    *
 ******************************************************************************
 *
 * FUNCTIONS:
 *
 *   InitApplication() - Initializes window data and registers window class
 *
 *   InitInstance()    - Saves instance handle and creates main window
 *
 *   MainWndProc()     - Process main window messages
 *
 *   ShowDataDlgProc() - Process the dialog box messages for acquired data
 *
 *   DisplayDlgProc()  - Process the dialog box messages for display range
 *
 *   ConfigDlgProc()   - Process the dialog box messages for configuration
 *
 *   GainListDlgProc() - Process the dialog box messages for gain list
 */

#include <windows.h>            /* required for all Windows applications */
#include <stdlib.h>
#include <windowsx.h>
#include <commdlg.h>
#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <commctrl.h>
#include "..\..\..\Include\driver.h"
#include "..\..\..\Include\os.h"

#include "resource.h"
#include "AdDmaBm.h"

// ----------------------------------------------------------------------------
// CONSTANT DEFINITION
// ----------------------------------------------------------------------------
#define     MAX_DEVICES     100
#define     MAX_CHANNELS    64

// ----------------------------------------------------------------------------
// GLOBAL VARIABLES
// ----------------------------------------------------------------------------
HANDLE      hInst;                      // current instance
HWND        hWnd;                       // main window handle
HDC         hdc;
RECT        rect;

static      DEVFEATURES        DevFeatures;       // structure for device features
static      DEVCONFIG_AI       Devconfig_AI;      // structure for DEVCONFIG_AI table
static      PT_DeviceGetFeatures  ptDevFeatures;  // Devfeatures table
static      PT_AIGetConfig     ptAIGetConfig;     // structure for AIGetConfig table

static      PT_FAIDmaExStart   ptFAIDmaExStart;   // FAIIntStart table
static      PT_FAITransfer     ptFAITransfer;     // FAITransfer table
static      PT_FAICheck        ptFAICheck;        // FAICheck table
static      PT_AllocateDMABuffer  ptAllocateDMABuffer;  // buffer table

static      PT_EnableEvent     ptEnableEvent;     // Enable event
static      PT_CheckEvent      ptCheckEvent;      // Check event

HANDLE      hThreadHandle;
DWORD       dwThreadID;

char        szErrMsg[80];               // Use for MESSAGEBOX function
char        szBuffer[80];				    // Temperatory buffer
LRESULT     ErrCde;                     // Return error code

//
// used for fixed memory for the installed devices
//
DEVLIST     DeviceList[MAX_DEVICES];
DEVLIST     SubDeviceList[MAX_DEVICES];

BOOL        bThreadflag = FALSE;
BOOL        bThreadloop = FALSE;
BOOL		bNoEventOccur = FALSE;	 

static  USHORT gwGain[MAX_CHANNELS];
static  USHORT gwGainCode;
static  USHORT gwGainCde[MAX_CHANNELS],ReorderGainCode[MAX_CHANNELS];
static  LONG   gwMaxLogChanNum;
static  ULONG  dwDeviceNum;                       // Device number

static  LONG   DriverHandle = (LONG)NULL;         // driver handle
static  USHORT gwDevice = 0, gwSubDevice = 0;     // device index
static  SHORT  gnNumOfDevices, gnNumOfSubdevices; // number of installed devices
static  DWORD  gdwPacerRate = 250000;               // pacer rate
static  ULONG  gulConvNum   = 200000;//40960;               // conversion number
static  USHORT gwStartChl   = 0, gwNumChl = 1;   // scan channels
static  USHORT gwDataType   = 1;                  // display type : FLOAT(1)
static  USHORT gwEvtFlag    = 1;                  // event enable(0)
static  ULONG  gwActualBufSize = 0;               // actual allocate buffer size
static  USHORT gwFifoEnable    = 0;               // Fifo disable(0)

static  USHORT gwGainList = 0;      // gain list flag
static  ULONG  gdwStartPt = 0, gdwStopPt = 99;    // display points
static  USHORT gwExtTrig  = 0;      // external or internal trigger
static  USHORT gwClockSrc = 0;		// Clock source
static  USHORT gwTrigEdge = 0;		// Trigger edge
static  USHORT gwSRCType  = 0;	   // Source type
static  FLOAT  gwTrigVol  = 0.0;		// Trigger voltage 

static  USHORT gwCyclicMode = 0;    // cyclic or non-cyclic mode
static  USHORT gwTrigMode   = 0;    // Trigger Mode
static  USHORT gwIntrCount  = 1;
static  ULONG  gwCyclicCount= 0;    // number of cyclic count

static  USHORT gwActiveBuf = 0;     // return by FAICheck
static  USHORT gwOverrun   = 0;     // return by FAICheck, FAITransfer
static  USHORT gwStopped   = 0;     // return by FAICheck
static  ULONG gulRetrieved = 0;     // return by FAICheck
static  USHORT gwHalfReady = 0;     // return by FAICheck
static  ULONG gwDelayCnt   = 2;

HGLOBAL hUserBuf, hDisplayBuf;

BOOL InitApplication(HANDLE hInstance);
BOOL InitInstance(HANDLE hInstance, int nCmdShow);
long FTYPE MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int  FTYPE WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
static FARPROC lpfnConfigDlgProc, lpfnShowDataDlgProc, lpfnDisplayDlgProc,
    lpfnGainListDlgProc;

static  HWND hwndStopButton, hwndStatusButton;
static  HANDLE  hInstance;
HMENU hMenu;

ULONG gulIntCounter     = 0;  // counter by adInterruptEvent
ULONG gulBfChgCounter   = 0;
ULONG gulOverrunCounter = 0;

ULONG gulOverrunTime  = 0;  // 0 = INFINITE
ULONG gulEventCount   = 1;    
char  szCounter[40];
BOOL  bBufferChange = 1;
BOOL  bInterrupt = 1;
BOOL  bOverrun   = 1;
BOOL  bTerminate = 1;

char szData[32];

void UserThread();
void adInterruptEvent();
void adBufChangeEvent();
void adOverrunEvent();
void adTerminateEvent();
int PhyChanToLogChan(DEVCONFIG_AI *pDevCfg,int phychan);
int GetMaxLogChanNum(DEVCONFIG_AI * pDevCfg,DEVFEATURES *pDevFeature);

/******************************************************************************
    FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)

    PURPOSE: calls initialization function, processes message loop
******************************************************************************/

int FTYPE WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
HANDLE hInstance;                            /* current instance             */
HANDLE hPrevInstance;                        /* previous instance            */
LPSTR lpCmdLine;                             /* command line                 */
int nCmdShow;                                /* show-window type (open/icon) */
{
    MSG msg;                                 /* message                      */

    if (!hPrevInstance)                  /* Other instances of app running?  */
        if (!InitApplication(hInstance)) /* Initialize shared things         */
            return (FALSE);              /* Exits if unable to initialize    */

    // Perform initializations that apply to a specific instance
    if (!InitInstance(hInstance, nCmdShow))
        return (FALSE);

    // Acquire and dispatch messages until a WM_QUIT message is received.
    while (GetMessage(&msg,        /* message structure                      */
        (HWND)NULL,                /* handle of window receiving the message */
        (UINT)NULL,                /* lowest message to examine              */
        (UINT)NULL))               /* highest message to examine             */
    {
        TranslateMessage(&msg);    /* Translates virtual key codes           */
        DispatchMessage(&msg);     /* Dispatches message to window           */
    }
    return (msg.wParam);           /* Returns the value from PostQuitMessage */
}

/******************************************************************************
    FUNCTION: InitApplication(HANDLE)

    PURPOSE: Initializes window data and registers window class
******************************************************************************/

BOOL InitApplication(hInstance)
HANDLE hInstance;                              /* current instance           */
{
    WNDCLASS  wc;

    // Fill in window class structure with parameters that describe the
    // main window.
    wc.style = CS_HREDRAW | CS_VREDRAW;   /* Class style(s).                 */
    wc.lpfnWndProc = (WNDPROC)MainWndProc;   /* window process procedure     */
    wc.cbClsExtra = 0;                    /* No per-class extra data.        */
    wc.cbWndExtra = 0;                    /* No per-window extra data.       */
    wc.hInstance = hInstance;             /* Application that owns the class.*/
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName =  "MyMenu";      /* Name of menu resource in .RC file.  */
    wc.lpszClassName = "MyClass";     /* Name used in call to CreateWindow. */

    // Register the window class and return success/failure code.
    return (RegisterClass(&wc));
}

/******************************************************************************
    FUNCTION:  InitInstance(HANDLE, int)

    PURPOSE:  Saves instance handle and creates main window
******************************************************************************/

BOOL InitInstance(hInstance, nCmdShow)
HANDLE          hInstance;          /* Current instance identifier.          */
int             nCmdShow;           /* Param for first ShowWindow() call.    */
{

    // Save the instance handle in static variable, which will be used in
    // many subsequence calls from this application to Windows.
    hInst = hInstance;

    // Create a main window for this application instance.
    hWnd = CreateWindow(
        "MyClass",                    /* See RegisterClass() call.           */
        "Advantech Driver Demo : Busmaster DMA Data Transfer" ,
        /* Window title bar  */
        WS_OVERLAPPEDWINDOW,          /* Window style.                       */
        CW_USEDEFAULT,                /* Default horizontal position.        */
        CW_USEDEFAULT,                /* Default vertical position.          */
        CW_USEDEFAULT,                /* Default width.                      */
        CW_USEDEFAULT,                /* Default height.                     */
        NULL,                         /* Overlapped windows have no parent.  */
        NULL,                         /* Use the window class menu.          */
        hInstance,                    /* This instance owns this window.     */
        NULL                          /* Pointer not needed.                 */
        );

    // If window could not be created, return "failure"
    if (!hWnd)
        return (FALSE);

    // Make the window visible; update its client area; and return "success"

    ShowWindow(hWnd, nCmdShow);     /* Show the window                       */
    UpdateWindow(hWnd);             /* Sends WM_PAINT message                */
    return (TRUE);                  /* Returns the value from PostQuitMessage*/
}

/******************************************************************************
    FUNCTION: GainListDlgProc(HWND, unsigned, WPARAM, LPARAM)

    PURPOSE:  Processes dialog box messages for gain list
******************************************************************************/

BOOL FTYPE GainListDlgProc(hDlg, message, wParam, lParam)
HWND hDlg;                                  /* window handle                 */
unsigned message;                           /* type of message               */
WPARAM wParam;                              /* additional information        */
LPARAM lParam;                              /* additional information        */
{
    USHORT i;
    HWND hGainListWnd;
    DWORD ListStyle;
    LVCOLUMN lvColum;
    LVITEM lvItem;
    char szBuff[40];
    static int iPos = -1;
    LPNMITEMACTIVATE lpnmitem;
    LPNMHDR lpnmhdr;
    DWORD dwPhyChan;    // Physical channel number
    char szTmpBuff[40];

    switch (message)
    {
    case WM_INITDIALOG :

        // ------------------------------------------------------------
        // Initialize Input Range List Combobox, it needs to get device
        // features for gain list
        // ------------------------------------------------------------

        // Step 1: Open Device
        ErrCde = DRV_DeviceOpen(dwDeviceNum,
                (LONG far *)&DriverHandle);
        if (ErrCde != SUCCESS)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",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: Get AI config
        ptAIGetConfig.buffer = (LPDEVCONFIG_AI)&Devconfig_AI;
        if ((ErrCde = DRV_AIGetConfig(DriverHandle,
            (LPT_AIGetConfig)&ptAIGetConfig)) != SUCCESS)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            MessageBox(hWnd,(LPCSTR)szErrMsg,"Driver Message",MB_OK);
            DRV_DeviceClose((LONG far *)&DriverHandle);
            return 0;
        }

        // Step 4: Initialize Input Range List Combobox with device features
        if (DevFeatures.usNumGain != 0)
        {
            for(i = 0; i < (USHORT)DevFeatures.usNumGain; i ++)
                SendDlgItemMessage(hDlg, IDC_CMB_GAIN, CB_ADDSTRING, 0,
                (LPARAM)((LPSTR)(DevFeatures.glGainList[i].szGainStr)));

            SendDlgItemMessage(hDlg, IDC_CMB_GAIN,
                CB_SELECTSTRING, (WPARAM)(-1),
                (LPARAM)((LPSTR)(DevFeatures.glGainList[0].szGainStr)));
        }
        
        // Step 5: Initialize Gain Setting List View
        // Set List View Style
        hGainListWnd = GetDlgItem(hDlg, IDC_LST_GAIN);
        ListStyle = ListView_GetExtendedListViewStyle(hGainListWnd);
        ListStyle = ListStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
        ListView_SetExtendedListViewStyle(hGainListWnd, ListStyle);
        
	
        // Insert Column
        lvColum.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH;
        wsprintf(szBuff, "%s", "Physical Chan");
        lvColum.pszText = szBuff;
        lvColum.fmt = LVCFMT_CENTER;
        lvColum.cx = 80;
        ListView_InsertColumn(hGainListWnd, 0, &lvColum);
        wsprintf(szBuff, "%s", "Gain");
        lvColum.cx = 80;
        ListView_InsertColumn(hGainListWnd, 1, &lvColum);
        wsprintf(szBuff, "%s", "Configuration");
        lvColum.cx = 90;
        ListView_InsertColumn(hGainListWnd, 2, &lvColum);
        

⌨️ 快捷键说明

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