/**
  ******************************************************************************
  * @file    air001xx_ll_led.h
  * @author  MCU Application Team
  * @brief   Header file of LED LL module.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) AirM2M.
  * All rights reserved.</center></h2>
  *
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef AIR001XX_LL_LED_H
#define AIR001XX_LL_LED_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "air001xx.h"

/** @addtogroup AIR001XX_LL_Driver
  * @{
  */

#if defined (LED)
/** @defgroup LED_LL LED
  * @{
  */

/* Private types -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/**
  * @brief LED Init Structure definition
  */
typedef struct
{
  uint32_t ComDrive;          /*!< Specifies the LED COM drive capability.
                                     This parameter can be a value of @ref LED_LL_EC_ComDrive */

  uint32_t Prescaler;         /*!< Specifies the prescaler value used to divide the LED clock.
                                     This parameter can be a number between Min_Data = 0x00(div1) and Max_Data = 0xFF(div256) */

  uint32_t ComSelect;            /*!< Specifies the number of COM open.
                                     This parameter can be a value of @ref LED_LL_EC_ComSelct */

  uint32_t LightTime;         /*!< Specifies LED Lighting time.
                                     This parameter can be a number between Min_Data = 1 and Max_Data = 0xFF */

  uint32_t DeadTime;          /*!< Specifies LED Dead time.
                                     This parameter can be a number between Min_Data = 1 and Max_Data = 0xFF */

} LL_LED_InitTypeDef;

/* Exported constants --------------------------------------------------------*/
/** @defgroup LED_LL_EC_ComDrive ComDrive
  * @{
  */
#define LL_LED_COMDRIVE_LOW          0x00000000U
#define LL_LED_COMDRIVE_HIGH         LED_CR_EHS
/**
  * @}
  */


/** @defgroup LED_LL_EC_ComSelct the number of COM open
  * @{
  */
#define LL_LED_COMSELECT_1COM             0x00000000U
#define LL_LED_COMSELECT_2COM             LED_CR_LED_COM_SEL_0
#define LL_LED_COMSELECT_3COM             LED_CR_LED_COM_SEL_1
#define LL_LED_COMSELECT_4COM             (LED_CR_LED_COM_SEL_1 | LED_CR_LED_COM_SEL_0)
/**
  * @}
  */

/** @defgroup LED_LL_EC_DisplayValue LED display value
  * @{
  */
#define LL_LED_DISP_NONE            0x00U
#define LL_LED_DISP_FULL            0xFFU

#define LL_LED_DISP_0               0x3FU
#define LL_LED_DISP_1               0x06U
#define LL_LED_DISP_2               0x5BU
#define LL_LED_DISP_3               0x4FU
#define LL_LED_DISP_4               0x66U
#define LL_LED_DISP_5               0x6DU
#define LL_LED_DISP_6               0x7DU
#define LL_LED_DISP_7               0x07U
#define LL_LED_DISP_8               0x7FU
#define LL_LED_DISP_9               0x6FU
#define LL_LED_DISP_A               0x77U
#define LL_LED_DISP_B               0x7CU
#define LL_LED_DISP_C               0x39U
#define LL_LED_DISP_D               0x5EU
#define LL_LED_DISP_E               0x79U
#define LL_LED_DISP_F               0x71U
#define LL_LED_DISP_H               0x76U
#define LL_LED_DISP_P               0x73U
#define LL_LED_DISP_U               0x3EU
#define LL_LED_DISP_DOT             0x80U
/**
  * @}
  */

/** @defgroup LED_LL_EC_ComDisplay LED COM Select
  * @{
  */
#define LL_LED_COM0                0x00000000U
#define LL_LED_COM1                0x00000004U
#define LL_LED_COM2                0x00000008U
#define LL_LED_COM3                0x0000000CU
/**
  * @}
  */

/** @defgroup LED_LL_EC_DataReg Data Register Mask and position
  * @{
  */
#define LL_LED_DR_DATA               LED_DR0_DATA0
#define LL_LED_DR_DATA_Pos           LED_DR0_DATA0_Pos
/**
  * @}
  */

/* Exported functions --------------------------------------------------------*/
/**
  * @brief  Set the LED COM drive capability.
  * @param  LEDx LED Instance
  * @param  ComDrive This parameter can be one of the following values:
  *         @arg @ref LL_LED_COMDRIVE_LOW
  *         @arg @ref LL_LED_COMDRIVE_HIGH
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetComDrive(LED_TypeDef *LEDx, uint32_t ComDrive)
{
  MODIFY_REG(LEDx->CR, LED_CR_EHS, ComDrive);
}

/**
  * @brief  Get the LED COM drive capability.
  * @param  LEDx LED Instance
  * @retval Returned value can be one of the following values:
  *         @arg @ref LL_LED_COMDRIVE_LOW
  *         @arg @ref LL_LED_COMDRIVE_HIGH
  */
__STATIC_INLINE uint32_t LL_LED_GetComDrive(LED_TypeDef *LEDx)
{
  return (READ_BIT(LEDx->CR, LED_CR_EHS));
}

/**
  * @brief  Enable LED Interrupt.
  * @param  LEDx LED Instance
  * @retval None
  */
__STATIC_INLINE void LL_LED_EnableIT(LED_TypeDef *LEDx)
{
  SET_BIT(LEDx->CR, LED_CR_IE);
}

/**
  * @brief  Disable LED Interrupt.
  * @param  LEDx LED Instance
  * @retval None
  */
__STATIC_INLINE void LL_LED_DisableIT(LED_TypeDef *LEDx)
{
  CLEAR_BIT(LEDx->CR, LED_CR_IE);
}
/**
  * @brief  Check if LED Interrupt is enabled
  * @param  LEDx LED Instance
  * @retval State of bit (1 or 0).
  */
__STATIC_INLINE uint32_t LL_LED_IsEnabledIT(LED_TypeDef *LEDx)
{
  return ((READ_BIT(LEDx->CR, LED_CR_IE) == (LED_CR_IE)) ? 1UL : 0UL);
}

/**
  * @brief  Set he number of COM open.
  * @param  LEDx LED Instance
  * @param  ComNum This parameter can be one of the following values:
  *         @arg @ref LL_LED_COMSELECT_1COM
  *         @arg @ref LL_LED_COMSELECT_2COM
  *         @arg @ref LL_LED_COMSELECT_3COM
  *         @arg @ref LL_LED_COMSELECT_4COM
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetComNum(LED_TypeDef *LEDx, uint32_t ComNum)
{
  MODIFY_REG(LEDx->CR, LED_CR_LED_COM_SEL, ComNum);
}

/**
  * @brief  Get the number of COM open.
  * @param  LEDx LED Instance
  * @retval Returned value can be one of the following values:
  *         @arg @ref LL_LED_COMSELECT_1COM
  *         @arg @ref LL_LED_COMSELECT_2COM
  *         @arg @ref LL_LED_COMSELECT_3COM
  *         @arg @ref LL_LED_COMSELECT_4COM
  */
__STATIC_INLINE uint32_t LL_LED_GetComNum(LED_TypeDef *LEDx)
{
  return (READ_BIT(LEDx->CR, LED_CR_LED_COM_SEL));
}


/**
  * @brief  Enable LED. 
  * @param  LEDx LED Instance
  * @retval None
  */
__STATIC_INLINE void LL_LED_Enable(LED_TypeDef *LEDx)
{
  SET_BIT(LEDx->CR, LED_CR_LEDON);
}

/**
  * @brief  Disable LED. 
  * @param  LEDx LED Instance
  * @retval None
  */
__STATIC_INLINE void LL_LED_Disable(LED_TypeDef *LEDx)
{
  CLEAR_BIT(LEDx->CR, LED_CR_LEDON);
}

/**
  * @brief  Checks if LED is enabled
  * @param  LEDx LED Instance
  * @retval State of bit (1 or 0).
  */
__STATIC_INLINE uint32_t LL_LED_IsEnabled(LED_TypeDef *LEDx)
{
  return ((READ_BIT(LEDx->CR, LED_CR_LEDON) == (LED_CR_LEDON)) ? 1UL : 0UL);
}

/**
  * @brief  Set the LED prescale Value.
  * @param  LEDx LED Instance
  * @param  Prescaler This parameter can be a number between Min_Data = 0x00(div1)
  *         and Max_Data = 0xFF(div256)
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetPrescaler(LED_TypeDef *LEDx, uint32_t Prescaler)
{
  MODIFY_REG(LEDx->PR, LED_PR_PR, (Prescaler << LED_PR_PR_Pos));
}

/**
  * @brief  Return LED Prescaler Value.
  * @param  LEDx LED Instance
  * @retval Returned value can be a number between Min_Data = 0x00(div1)
  *         and Max_Data = 0xFF(div256)
  */
__STATIC_INLINE uint32_t LL_LED_GetPrescaler(LED_TypeDef *LEDx)
{
  return (READ_BIT(LEDx->PR, LED_PR_PR) >> LED_PR_PR_Pos);
}

/**
  * @brief  Set the LED Lighting and Dead time.
  * @param  LEDx LED Instance
  * @param  LightTime This parameter can be a number between Min_Data = 1 and
  *         Max_Data = 0xFF
  * @param  DeadTime This parameter can be a number between Min_Data = 1 and
  *         Max_Data = 0xFF
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetLightAndDeadTime(LED_TypeDef *LEDx,\
  uint32_t LightTime, uint32_t DeadTime)
{
  MODIFY_REG(LEDx->TR, (LED_TR_T1 | LED_TR_T2), ((LightTime << LED_TR_T1_Pos) |\
      (DeadTime << LED_TR_T2_Pos)));
}

/**
  * @brief  Set the LED Lighting time.
  * @param  LEDx LED Instance
  * @param  LightTime This parameter can be a number between Min_Data = 1 and
  *         Max_Data = 0xFF
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetLightTime(LED_TypeDef *LEDx, uint32_t LightTime)
{
  MODIFY_REG(LEDx->TR, LED_TR_T1, (LightTime << LED_TR_T1_Pos));
}

/**
  * @brief  Set the LED Dead time.
  * @param  LEDx LED Instance
  * @param  DeadTime This parameter can be a number between Min_Data = 1 and
  *         Max_Data = 0xFF
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetDeadTime(LED_TypeDef *LEDx, uint32_t DeadTime)
{
  MODIFY_REG(LEDx->TR, LED_TR_T2, (DeadTime << LED_TR_T2_Pos));
}

/**
  * @brief  Get the LED Lighting time.
  * @param  LEDx LED Instance
  * @retval Returned value can be a number between Min_Data = 1 and
  *         Max_Data = 0xFF
  */
__STATIC_INLINE uint32_t LL_LED_GetLightTime(LED_TypeDef *LEDx)
{
  return (READ_BIT(LEDx->TR, LED_TR_T1) >> LED_TR_T1_Pos);
}

/**
  * @brief  Get the LED Dead time.
  * @param  LEDx LED Instance
  * @retval Returned value can be a number between Min_Data = 1 and
  *         Max_Data = 0xFF
  */
__STATIC_INLINE uint32_t LL_LED_GetDeadTime(LED_TypeDef *LEDx)
{
  return (READ_BIT(LEDx->TR, LED_TR_T2) >> LED_TR_T2_Pos);
}

/**
  * @brief  Set the LED display value.
  * @param  LEDx LED Instance
  * @param  comCh Specify COM channels.This parameter can be one of the following values:
  *         @arg @ref LL_LED_COM0
  *         @arg @ref LL_LED_COM1
  *         @arg @ref LL_LED_COM2
  *         @arg @ref LL_LED_COM3
  * @param  data Specify display values.This parameter can be one of the following values:
  *         @arg @ref LL_LED_DISP_NONE
  *         @arg @ref LL_LED_DISP_FULL
  *         @arg @ref LL_LED_DISP_0
  *         @arg @ref LL_LED_DISP_1
  *         @arg @ref LL_LED_DISP_2
  *         @arg @ref LL_LED_DISP_3
  *         @arg @ref LL_LED_DISP_4
  *         @arg @ref LL_LED_DISP_5
  *         @arg @ref LL_LED_DISP_6
  *         @arg @ref LL_LED_DISP_7
  *         @arg @ref LL_LED_DISP_8
  *         @arg @ref LL_LED_DISP_9
  *         @arg @ref LL_LED_DISP_A
  *         @arg @ref LL_LED_DISP_B
  *         @arg @ref LL_LED_DISP_C 
  *         @arg @ref LL_LED_DISP_D
  *         @arg @ref LL_LED_DISP_E
  *         @arg @ref LL_LED_DISP_F
  *         @arg @ref LL_LED_DISP_H
  *         @arg @ref LL_LED_DISP_P
  *         @arg @ref LL_LED_DISP_U
  *         @arg @ref LL_LED_DISP_DOT
  * @retval None
  */
__STATIC_INLINE void LL_LED_SetDisplayValue(LED_TypeDef *LEDx,uint32_t comCh,\
  uint32_t data)
{
  MODIFY_REG((*((uint32_t *)((uint32_t)&(LEDx->DR0) + comCh))), LL_LED_DR_DATA,\
     (data << LL_LED_DR_DATA_Pos));
}

/**
  * @brief  Get the LED display value.
  * @param  LEDx LED Instance
  * @param  comCh Specify COM channels.This parameter can be one of the following values:
  *         @arg @ref LL_LED_COM0
  *         @arg @ref LL_LED_COM1
  *         @arg @ref LL_LED_COM2
  *         @arg @ref LL_LED_COM3
  * @retval Returned value can be one of the following values:
  *         @arg @ref LL_LED_DISP_NONE
  *         @arg @ref LL_LED_DISP_FULL
  *         @arg @ref LL_LED_DISP_0
  *         @arg @ref LL_LED_DISP_1
  *         @arg @ref LL_LED_DISP_2
  *         @arg @ref LL_LED_DISP_3
  *         @arg @ref LL_LED_DISP_4
  *         @arg @ref LL_LED_DISP_5
  *         @arg @ref LL_LED_DISP_6
  *         @arg @ref LL_LED_DISP_7
  *         @arg @ref LL_LED_DISP_8
  *         @arg @ref LL_LED_DISP_9
  *         @arg @ref LL_LED_DISP_A
  *         @arg @ref LL_LED_DISP_B
  *         @arg @ref LL_LED_DISP_C 
  *         @arg @ref LL_LED_DISP_D
  *         @arg @ref LL_LED_DISP_E
  *         @arg @ref LL_LED_DISP_F
  *         @arg @ref LL_LED_DISP_H
  *         @arg @ref LL_LED_DISP_P
  *         @arg @ref LL_LED_DISP_U
  *         @arg @ref LL_LED_DISP_DOT
  */
__STATIC_INLINE uint32_t LL_LED_GetDisplayValue(LED_TypeDef *LEDx, uint32_t comCh)
{
  return ((READ_BIT((*((uint32_t *)((uint32_t)&(LEDx->DR0) + comCh))), LL_LED_DR_DATA))\
      >> LL_LED_DR_DATA_Pos);
}


/**
  * @brief  Get the LED interrupt flag.
  * @param  LEDx LED Instance
  * @retval State of bit (1 or 0).
  */
__STATIC_INLINE uint32_t LL_LED_IsActiveFlag_IT(LED_TypeDef *LEDx)
{
  return ((READ_BIT(LEDx->IR, LED_IR_FLAG) == (LED_IR_FLAG)) ? 1UL : 0UL);
}

/**
  * @brief  the LED interrupt flag.
  * @param  LEDx LED Instance
  * @retval None
  */
__STATIC_INLINE void LL_LED_ClearFlag_IT(LED_TypeDef *LEDx)
{
  SET_BIT(LEDx->IR, LED_IR_FLAG);
}

/**
  * @}
  */

#if defined(USE_FULL_LL_DRIVER)
/** @defgroup LED_LL_EF_Init Initialization and de-initialization functions
  * @{
  */

ErrorStatus LL_LED_DeInit(LED_TypeDef *LEDx);
ErrorStatus LL_LED_Init(LED_TypeDef *LEDx, LL_LED_InitTypeDef *LED_InitStruct);
void LL_LED_StructInit(LL_LED_InitTypeDef *LED_InitStruct);

/**
  * @}
  */
#endif /* USE_FULL_LL_DRIVER */

/**
  * @}
  */

#endif /* LED */

/**
  * @}
  */

#ifdef __cplusplus
}
#endif

#endif /* AIR001xx_LL_LED_H */

/************************ (C) COPYRIGHT AirM2M *****END OF FILE****/
