/**
  **********************************************************************************
  * @file    rtc_hal.c
  * @author  Product application department
  * @version V1.0
  * @date    2020.02.25
  * @brief   RTC模块HAL层驱动..
  * @note 这个文件提供了hal层rtc接口:
  *
  @verbatim
  ===================================================================================
                                  ##### 更新 #####
  ===================================================================================
  [..] 更新时间:
  [..] 更新人:
  [..] 更新内容:
        1. nothing.
  @endverbatim
 */

#include "rtc_hal.h"

/*** 全局变量定义 ***************************************************************/
/** @
  * @{volatile
  */
/** @ 
  * @}
  */
/** @ 
  * @{static
  */
/** @ 
  * @}
  */
/*** 常量定义 *******************************************************************/
/** @
  * @{const
  */
/** @ 
  * @}
  */

/*** 函数定义 *******************************************************************/

/**
 * @brief RTC中断服务函数
 * 
 * @retval NONE
*/
void HAL_RTC_IRQHandler(void)
{
    DRV_RTC_IRQHandler();
}

/**
 * @brief RTC报警配置
 * 
 * @@param[in] AlarmITType：中断类型
 * @@param[in] AlarmType：报警类型
 * @@param[in] Time：时间
 * @retval NONE
*/
void HAL_RTC_AralmConfig(RTC_AlarmITTypeDef AlarmITType, RTC_AlarmTypeDef AlarmType, RTC_TimeTypeDef *Time)
{
    if (ALARM_DAY & AlarmITType)
    {
        _rtc_pra1r_alarm_day_en;
        _rtc_pra1r_alarm_day_counter_set(Time->days);
    }
    
    if (ALARM_HOUR & AlarmITType)
    {
        _rtc_pra2r_alarm_hour_en;
        _rtc_pra2r_alarm_hour_counter_set(Time->hours);
    }
    
    if (ALARM_MIN & AlarmITType)
    {
        _rtc_pra2r_alarm_min_en;
        _rtc_pra2r_alarm_min_counter_set(Time->minutes);
    }

    if (ALARM_SEC & AlarmITType)
    {
        _rtc_pra2r_alarm_sec_en;
        _rtc_pra2r_alarm_sec_counter_set(Time->seconds);
    }

    if (ALARM_LOW_LEVEL == AlarmType)
    {
        _rtc_prcsr_ie_type_low_level;
    }
    else if(ALARM_RISE == AlarmType)
    {
        _rtc_prcsr_ie_type_rise_edge;
    }
    else if(ALARM_FALL == AlarmType)
    {
        _rtc_prcsr_ie_type_fall_edge;
    }
    else if(ALARM_RISE_FALL == AlarmType)
    {
        _rtc_prcsr_ie_type_rise_fall_edge;
    }
    else
    {}

    /* 开RTC中断 */
    NVIC_Init(3, 3, PMU_RTC_IRQn, 2);

    _rtc_prcsr_alarm_pulse_ie_en;

}

/**
 * @brief RTC初始化
 * 
 * @@param[in] pRTCInit：指向RTC初始化结构体的指针
 * @retval @ref HAL_StatusTypeDef
*/
HAL_StatusTypeDef HAL_RTC_Init(RTC_InitTypeDef *pRTCInit)
{
    HAL_StatusTypeDef ret = HAL_OK;
    uint32_t rtc_wclk_div = 0;

    rtc_wclk_div = pRTCInit->sys_clk/RTC_WCLK_MAX;

    if (rtc_wclk_div >= 1)
    {
        rtc_wclk_div--;
    }
    	
    /* Update RTC Counter(function case Dir=0)*/

    /* 输入key */
    _rtc_prkeyr_key_set;  

    /* 分频 */
    _rtc_prcsr_wclk_div(rtc_wclk_div);

    /* set dir = 0 */
    _rtc_prcsr_direct_control_dis;
    
    DRV_RTC_SetTimeCounter(&pRTCInit->set_time);

    if (pRTCInit->alarm_it_type)
    {
        HAL_RTC_AralmConfig(pRTCInit->alarm_it_type, pRTCInit->alarm_type, &pRTCInit->set_aralm_time);
    }

    DelayMS(500);

    return ret;
}
/**
 * @brief 获取RTC时间
 * 
 * @@param[in] Time：时间
 * @retval NONE
*/
void HAL_RTC_GetTime(RTC_TimeTypeDef *Time)
{
    DRV_RTC_GetTimeCounter(Time);
}

/**
 * @brief 设置RTC时间
 * 
 * @@param[in] Time：时间
 * @retval NONE
*/
void HAL_RTC_SetTime(RTC_TimeTypeDef *Time)
{
    DRV_RTC_SetTimeCounter(Time);
}




