#ifndef RTE_RTC_H__
#define RTE_RTC_H__


#include <stdint.h>
#include "rtc.h"

#define RTC_MODE_MAIN 0U
#define RTC_MODE_SUB 1U

#define RTC_MODE_SELECT RTC_MODE_MAIN

/* RTC default time setting */
#ifndef RTC_DEFAULT_TIME
#define RTC_DEFAULT_TIME 1U
#define RTC_DEFAULT_YEAR 20U
#define RTC_DEFAULT_MONTH 1U
#define RTC_DEFAULT_DATE 1U
#define RTC_DEFAULT_WEEK 3U /*must be right*/
#define RTC_DEFAULT_HOUR 0U
#define RTC_DEFAULT_MINUTE 0U
#define RTC_DEFAULT_SECOND 0U
#endif

/*only use for alarm */
typedef enum
{
	RTC_ALARM_SUN = 0X01U,	/*Sunday*/
	RTC_ALARM_SAT = 0X02U,	/*Saturday*/
	RTC_ALARM_FRI = 0X04U,	/*Friday*/
	RTC_ALARM_THUR = 0X08U, /*Thursday*/
	RTC_ALARM_WED = 0X10U,	/*Wednesday*/
	RTC_ALARM_TUE = 0X20U,	/*Tuesday*/
	RTC_ALARM_MON = 0X40U,	/*Monday*/
	RTC_ALARM_DAYS = 0X7FU, /*everyday*/

} RTC_Alarm_Days_en_t;

typedef struct
{
	uint8_t u8RTCYear;		 /*00~~99 in Dec*/
	uint8_t u8RTCMonth;		 /*01~~12 in Dec*/
	uint8_t u8RTCDayOfMonth; /*01~~31 in Dec*/
	uint8_t u8RTCDayOfWeek;	 /*0~~6 in Dec*/
	uint8_t u8RTCHour;		 /*fix 24Hour Format 00~~23 in  Dec*/
	uint8_t u8RTCMinute;	 /*0~~59 in Dec*/
	uint8_t u8RTCSecond;	 /*0~~59 in Dec*/
} RTC_Information_st_t;

extern volatile uint8_t g_RTCLeapYear; /*1:LeapYear , 0:Not a leap year*/
extern  RTC_Information_st_t g_stRTCInformation;

/* RTC exported time register */
#define RTC_YEAR g_stRTCInformation.u8RTCYear
#define RTC_MONTH g_stRTCInformation.u8RTCMonth
#define RTC_DATE g_stRTCInformation.u8RTCDayOfMonth
#define RTC_WEEK g_stRTCInformation.u8RTCDayOfWeek
#define RTC_HOUR g_stRTCInformation.u8RTCHour
#define RTC_MINUTE g_stRTCInformation.u8RTCMinute
#define RTC_SECOND g_stRTCInformation.u8RTCSecond
#define RTC_LEAP_YEAR g_RTCLeapYear

uint8_t RTC_Bcd2ToByte(uint8_t Value);
uint8_t RTC_ByteToBcd2(uint8_t Value);
extern void RTE_RTC_Pre_Init(void);
extern void RTE_RTC_Init(RTC_Information_st_t g_stRTCInformation);
extern void RTE_RTC_Set_Time(RTC_TimeTypeDef* RTC_TimeStruct, RTC_DateTypeDef* RTC_DateStruct);
extern void RTE_RTC_Get_CounterValue(RTC_CounterTypeDef *counter_val);
extern void RTE_RTC_Alarm_Set(RTC_Alarm_Days_en_t enAlarmDays, uint8_t u8RTCHour, uint8_t u8RTCMinute);


#endif