#include "intp.h"

/**
  * @brief  This function initializes the external interrupt module.
  * @param  Intp_InitStruct: pointer to a INTP_InitTypeDef structure that contains
  *         the configuration information for the specified INTP peripheral.
  * @retval None
  */
void INTP_Init(INTP_InitTypeDef* Intp_InitStruct)
{
	volatile uint8_t w_count;
	uint16_t pinpos = 0x00,pinnum=0x00, pos = 0x00, currentpin = 0x00;

    /* Check the parameters */
    assert_param(IS_INTP_TYPE(Intp_InitStruct->INTP_Select));
	for(pinpos = 0x00; pinpos < INTP_MAX; pinpos++)
	{
		pos = ((uint16_t)0x01) << pinpos;
		pinnum = Intp_InitStruct->INTP_Select & pos;
		if(pinnum == pos)
		{
			currentpin = pinpos;
			break;
		}
	}
	if(Intp_InitStruct->INTP_Select < INTP8)
	{
		INTM->EGN0 &= ~Intp_InitStruct->INTP_Select;
		INTM->EGP0 &= ~Intp_InitStruct->INTP_Select;
		
		INTM->EGN0 |= ((Intp_InitStruct->EXTI_Trigger & 0x01U) >> 0) << currentpin;
		INTM->EGP0 |= ((Intp_InitStruct->EXTI_Trigger & 0x02U) >> 1) << currentpin;	
	}
	else
	{
		INTM->EGN1 &= ~Intp_InitStruct->INTP_Select;
		INTM->EGP1 &= ~Intp_InitStruct->INTP_Select;
		
		INTM->EGN1 |= ((Intp_InitStruct->EXTI_Trigger & 0x01U) >> 0) << (currentpin-8);
		INTM->EGP1 |= ((Intp_InitStruct->EXTI_Trigger & 0x02U) >> 1) << (currentpin-8);	
	
	}
    for (w_count = 0U; w_count <= KEY_WAITTIME; w_count++)
    {   
        __NOP();
    }	
}

/**
  * @brief  This function clears INTP interrupt flag and enables interrupt.
  * @param  pinMsk:select the active external interrupt pins
  * 	@arg  INTP0/INTP1/INTP2/INTP3
  * @retval None
  */
void INTP_Start(uint16_t pinMsk)
{
    if(pinMsk & (1 << 0))
    {
        INTC_ClearPendingIRQ(INTP0_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP0_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 1))
    {
        INTC_ClearPendingIRQ(INTP1_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP1_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 2))
    {
        INTC_ClearPendingIRQ(INTP2_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP2_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 3))
    {
        INTC_ClearPendingIRQ(INTP3_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP3_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 4))
    {
        INTC_ClearPendingIRQ(INTP4_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP4_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 5))
    {
        INTC_ClearPendingIRQ(INTP5_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP5_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 6))
    {
        INTC_ClearPendingIRQ(INTP6_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP6_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 7))
    {
        INTC_ClearPendingIRQ(INTP7_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP7_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 8))
    {
        INTC_ClearPendingIRQ(INTP8_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP8_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 9))
    {
        INTC_ClearPendingIRQ(INTP9_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP9_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 10))
    {
        INTC_ClearPendingIRQ(INTP10_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP10_IRQn);       /* enable INTP interrupt */
    }
    if(pinMsk & (1 << 11))
    {
        INTC_ClearPendingIRQ(INTP11_IRQn); /* clear INTP interrupt flag */
        INTC_EnableIRQ(INTP11_IRQn);       /* enable INTP interrupt */
    }
}

/**
  * @brief  This function disables INTP interrupt and clears interrupt flag.
  * @param  pinMsk:select the active external interrupt pins
  * 	@arg  INTP0/INTP1/INTP2/INTP3
  * @retval None
  */
void INTP_Stop(uint16_t pinMsk)
{
    if(pinMsk & (1 << 0))
    {
        INTC_DisableIRQ(INTP0_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP0_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 1))
    {
        INTC_DisableIRQ(INTP1_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP1_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 2))
    {
        INTC_DisableIRQ(INTP2_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP2_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 3))
    {
        INTC_DisableIRQ(INTP3_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP3_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 4))
    {
        INTC_DisableIRQ(INTP4_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP4_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 5))
    {
        INTC_DisableIRQ(INTP5_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP5_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 6))
    {
        INTC_DisableIRQ(INTP6_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP6_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 7))
    {
        INTC_DisableIRQ(INTP7_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP7_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 8))
    {
        INTC_DisableIRQ(INTP8_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP8_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 9))
    {
        INTC_DisableIRQ(INTP9_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP9_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 10))
    {
        INTC_DisableIRQ(INTP10_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP10_IRQn);  /* clear INTP interrupt flag */
    }
    if(pinMsk & (1 << 11))
    {
        INTC_DisableIRQ(INTP11_IRQn);       /* disable INTP interrupt */
        INTC_ClearPendingIRQ(INTP11_IRQn);  /* clear INTP interrupt flag */
    }
}