/*!
 * @file    	apm32f10x_eint.c
 *
 * @brief	 	This file provides all the EINT firmware functions
 *
 * @details	
 *
 * @version		V1.0.0
 *
 * @date    	2019-8-6
 *
 */
#include "apm32f10x_eint.h"

/*!
 * @brief		Reset the EINT peripheral registers to their default reset values
 *
 * @param		None
 *
 * @retval		None
 *
 * @note 
 */
void EINT_Reset(void)
{
	EINT->IEN = 0x00000000;
	EINT->EEN = 0x00000000;
	EINT->RTEN = 0x00000000;
	EINT->FTEN = 0x00000000;
	EINT->IF = 0x000FFFFF;
}

/*!
 * @brief		Configure the EINT
 *
 * @param		configStruct: pointer to a EINT_ConfigStruct_T structure
 *
 * @retval		None
 *
 * @note 
 */
void EINT_Config( EINT_ConfigStruct_T* configStruct)
{
	uint32_t temp = 0;
	temp = (uint32_t)EINT_BASE;
	
	if(configStruct->EINT_LineCmd != DISABLE)
	{
		EINT->IEN &= ~configStruct->EINT_Line;
		EINT->EEN &= ~configStruct->EINT_Line;
		
		temp += configStruct->EINT_Mode;
		*(__IOM uint32_t *) temp |= configStruct->EINT_Line;
		
		EINT->RTEN &= ~configStruct->EINT_Line;
		EINT->FTEN &= ~configStruct->EINT_Line;
		
		if (configStruct->EINT_Trigger == EINT_Trigger_Rising_Falling)
		{

            EINT->RTEN |= configStruct->EINT_Line;
			EINT->FTEN |= configStruct->EINT_Line;
		}
		else
		{
			temp = (uint32_t)EINT_BASE;
			temp += configStruct->EINT_Trigger;
			
            *(__IOM uint32_t *) temp |= configStruct->EINT_Line;
		}
	}
	else
	{
		temp += configStruct->EINT_Mode;
		
		*(__IOM uint32_t *) temp &= ~configStruct->EINT_Line;
	}
}

/*!
 * @brief		Produce a Software Interrupt
 *
 * @param		EINT_Line: specifies the EINT lines to be enabled or disabled
 *
 * @retval		None
 *
 * @note 
 */
void EINT_ProduceSWInterrupt(EINT_LINE_T EINT_Line)
{
	EINT->SWIEN |= EINT_Line;
}

/*!
 * @brief		Read the specified EINT_Line flag
 *
 * @param		EINT_Line: Select the EINT_Line
 *
 * @retval		status: The new state of flag (SET or RESET)
 *
 * @note 
 */
uint8_t EINT_ReadFlag(EINT_LINE_T EINT_Line)
{
	uint8_t status = RESET;
	
	if((EINT->IF & EINT_Line) != (uint32_t)RESET)
	{
		status = SET;
	}
	else
	{
		status = RESET;
	}
	return status;
}

/*!
 * @brief		Clears the EINT_Line pending bits
 *
 * @param		EINT_Line: Select the EINT_Line
 *
 * @retval		None
 *
 * @note 
 */
void EINT_ClearFlag(EINT_LINE_T EINT_Line)
{
	EINT->IF = EINT_Line;
}

/*!
 * @brief		Read the specified EINT_Line Interrupt Flag
 *
 * @param		EINT_Line: Select the EINT_Line
 *
 * @retval		None
 *
 * @note 
 */
uint8_t EINT_ReadIntFlag(EINT_LINE_T EINT_Line)
{
	uint8_t status = RESET;
	uint32_t enablestatus = 0;
	
	enablestatus = EINT->IEN & EINT_Line;
	
	if((EINT->IF & EINT_Line) != ((uint32_t)RESET) && (enablestatus != (uint32_t)RESET))
	{
		status = SET;
	}
	else
	{
		status = RESET;
	}
	return status;
}

/*!
 * @brief		Clears the EINT_Line pending bits
 *
 * @param		EINT_Line: Select the EINT_Line
 *
 * @retval		None
 *
 * @note 
 */
void EINT_ClearIntFlag(EINT_LINE_T EINT_Line)
{
	EINT->IF = EINT_Line;
}
