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

📄 addmabm.cpp

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
    //Free resource 
    DRV_FAIStop(*pDrvHandle);
	VirtualFree(
			hUserBuf,                   // base address of block
			2 * gulConvNum,             // bytes of committed pages
			MEM_DECOMMIT| MEM_RELEASE); // decommit the pages
    VirtualFree(
                hDisplayBuf,                   // base address of block
                2 * gulConvNum,             // bytes of committed pages
                MEM_DECOMMIT| MEM_RELEASE); // decommit the pages

    

    //Error message 
    ErrorHandler(dwErrCde);
    printf("Program terminated!\n");
    
    //Close device
    DRV_DeviceClose(pDrvHandle);

    printf("Press any key to exit....");
    getch();
    exit(0);
}//ErrorStop

/*********************************************************************
 * Function: UserThread
 * Parameters: pISamples, IN, the count of DMA convertion number
 * Return value: none
 * Purpose: Check the event and handle it
 ********************************************************************/

void UserThread(LPVOID pISamples)
{
	USHORT usEventType;
	LONG   ErrCde;
	
	while (bThreadloop) {
		ptCheckEvent.EventType    = &usEventType;
		ptCheckEvent.Milliseconds = INFINITE;

		if (ErrCde = DRV_CheckEvent(lDriverHandle, (LPT_CheckEvent)&ptCheckEvent)!=0) {
			printf("Check event error!\n");
			return;
		}

		if (usEventType & ADS_EVT_INTERRUPT)
            adInterruptEvent();
		
        // Process buffer change event
        if (usEventType & ADS_EVT_BUFCHANGE)
            adBufChangeEvent(*(int *)pISamples);
		
        // Process overrun event
        if (usEventType & ADS_EVT_OVERRUN)
            adOverrunEvent();
		
        // Process terminate event
        if (usEventType & ADS_EVT_TERMINATED)
        {
            adTerminateEvent(*(int *)pISamples);
			bThreadFlag = FALSE;
            return ;
        }
	}
			
}

/**********************************************************************
 * Function: adInterruptEvent
 * Parameters:
 * Return value:
 * Purpose: Handle the Interrupt event
***********************************************************************/

void adInterruptEvent()
{
	//add your own Interrupt code here
	//printf("Interrupt event happened\n");
	return;
}

/**********************************************************************
 * Function: adBufChangeEvent
 * Parameters: 
 * Return value:
 * Purpose: Handle the Buffer Change event
***********************************************************************/

void adBufChangeEvent(int ConvCount)
{
	USHORT usActiveBuf;         //for PT_FAICheck to return data 
    USHORT usStopped;
    ULONG  ulRetrieved;
    USHORT usHalfReady;
	USHORT usOverrun;
	PT_FAICheck ptFAICheck;

	ptFAICheck.ActiveBuf = &usActiveBuf; // not used for single buffer
	ptFAICheck.stopped   = &usStopped;   // returned status: 1: complete, 0: imcomplete
	ptFAICheck.retrieved = &ulRetrieved; // actual conversion count
	ptFAICheck.overrun   = &usOverrun;   // not used for non-cyclic mode
	ptFAICheck.HalfReady = &usHalfReady; // not used for single buffer

	if ((ErrCde=DRV_FAICheck(lDriverHandle,(LPT_FAICheck)&ptFAICheck) != 0)) {
		DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("%s\n", szErrMsg);
        return ;
	}

	if(1 == usHalfReady){
		ptFAITransfer.ActiveBuf = 0;
		ptFAITransfer.DataType = gwDataType;
		ptFAITransfer.start = 0;
		ptFAITransfer.count = ConvCount/2;
		ptFAITransfer.overrun = &usHalfReady;
		if ((ErrCde = DRV_FAITransfer(lDriverHandle,
            (LPT_FAITransfer)&ptFAITransfer)) != 0)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            printf("%s\n", szErrMsg);
            return ;
        }
    }else if (2 == usHalfReady) {
		ptFAITransfer.ActiveBuf = 0;
		ptFAITransfer.DataType = gwDataType;
		ptFAITransfer.start = ConvCount/2;
		ptFAITransfer.count = ConvCount/2;
		ptFAITransfer.overrun = &usHalfReady;
		if ((ErrCde = DRV_FAITransfer(lDriverHandle,
            (LPT_FAITransfer)&ptFAITransfer)) != 0)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            printf("%s\n", szErrMsg);
            return ;
        }
    }
	gwCyclicCount ++;
	printf("\nThe DMA is working...\nThe times of buffer changed:%d\n", gwCyclicCount);

	return;
}

/**********************************************************************
 * Function: adOverrunEvent
 * Parameters: none
 * Return value: none
 * Purpose: Handle the Overrun event
***********************************************************************/

void adOverrunEvent()
{

	// clear overrun
    if ((ErrCde = DRV_ClearOverrun(lDriverHandle)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("\n%s\n", szErrMsg);
        return ;
    }

    return;
}


/**********************************************************************
 *Function: adTerminateEvent
 *Parameters:
 *Return value:
 *Purpose: Handle the Terminate event
***********************************************************************/

void adTerminateEvent(int ConvCount)
{
	// Stop A/D conversion
    USHORT usOverrun;
	int i;
	char szData[40];
	if ((ErrCde = DRV_FAIStop(lDriverHandle)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("\n%s\n",szErrMsg);;
        return ;
    }

    // Get real voltage of buffer from driver
    ptFAITransfer.ActiveBuf = 0;   // single buffer
    ptFAITransfer.DataType = gwDataType;    // float
    ptFAITransfer.start    = 0;   
    ptFAITransfer.count    = ConvCount;
    ptFAITransfer.overrun  = &usOverrun;

    if ((ErrCde = DRV_FAITransfer(lDriverHandle,
        (LPT_FAITransfer)&ptFAITransfer)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("\n%s\n",szErrMsg);;
        return ;
    }

    // Display Data
	printf("\n");
   for ( i=0; i<100; i++ )
    {
        if ( gwDataType )
        {
           sprintf( szData, "Buf[ %07d ]=%8.6f", i+ptFAITransfer.start, 
              ((float*)ptFAITransfer.DataBuffer)[i] );                                 
        }
        else
        {
           sprintf( szData, "Buf[ %07d ]=%   x", i+ptFAITransfer.start, 
              ((USHORT *)ptFAITransfer.DataBuffer)[i] );                                 
        }
        printf( "%s\n", szData );  
   }

	printf("\nPress any key to exit....");

    bThreadloop = FALSE;
	Sleep(100);

    return;
}

void GetStatus(int gulConvNum)
{
	USHORT usActiveBuf;         //for PT_FAICheck to return data 
    USHORT usStopped;
    ULONG  ulRetrieved;
    USHORT usHalfReady;
	USHORT usOverrun;
	PT_FAICheck ptFAICheck;
	double ratio;
	
	ptFAICheck.ActiveBuf = &usActiveBuf;
	ptFAICheck.stopped   = &usStopped;
	ptFAICheck.HalfReady = &usHalfReady;
	ptFAICheck.retrieved = &ulRetrieved;
	ptFAICheck.overrun   = &usOverrun;

	if (ErrCde=DRV_FAICheck(lDriverHandle, (LPT_FAICheck)&ptFAICheck) != 0) {
		DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("%s\n", szErrMsg);
        return ;
	}else{
		printf("\n*************************************************************\n");
		printf("Cyclic Counts: %d\n", gwCyclicCount);
		if (usHalfReady == 0)
			printf("Buffer : not  ready\n");
		else if (usHalfReady == 1)
			printf("Buffer : half ready\n");
		else if (usHalfReady == 2)
			printf("Buffer : full ready\n");
		else
			printf("Buffer : unknow \n");
		ratio = 100.0 * ulRetrieved / gulConvNum;
		printf("Finish:   %.2f%%\n", ratio);
		printf("*************************************************************\n");
	}
	return;

}

void Stop(int ConvCount)
{
	USHORT usOverrun;
	int i;
	char szData[80];
		
	if ((ErrCde = DRV_FAIStop(lDriverHandle)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("\n%s\n",szErrMsg);
        return ;
    }

	ptFAITransfer.ActiveBuf = 0;   // single buffer
    ptFAITransfer.DataType = gwDataType;    // float
    ptFAITransfer.start    = 0;   
    ptFAITransfer.count    = ConvCount;
    ptFAITransfer.overrun  = &usOverrun;
	
    if ((ErrCde = DRV_FAITransfer(lDriverHandle,
        (LPT_FAITransfer)&ptFAITransfer)) != 0)
    {
        DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
        printf("\n%s\n",szErrMsg);
        return ;
    }
	
    // Display Data
	printf("\n\n");
	printf("Cyclic number: %d\n", gwCyclicCount);
   for ( i=0; i<100; i++ )
    {
        if ( gwDataType )
        {
           sprintf( szData, "Buf[ %07d ]=%8.6f", i+ptFAITransfer.start, 
              ((float*)ptFAITransfer.DataBuffer)[i] );                                 
        }
        else
        {
           sprintf( szData, "Buf[ %07d ]=%   x", i+ptFAITransfer.start, 
              ((USHORT *)ptFAITransfer.DataBuffer)[i] );                                 
        }
        printf( "%s\n", szData );  
   }
    bThreadFlag = false;
	bThreadloop = false;
	printf("\nPress any key to exit....");
	Sleep(100);
}

⌨️ 快捷键说明

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