/**
*****************************************************************************
* @file rtc.h
* @author Yancy
* @version V1.0.0
* @date 19-June-2013
* @brief rtc module driver header file
* change log:
* Modify by Sam -20140624
*****************************************************************************
* @attention
*
*
© COPYRIGHT 2013 MVSilicon
*/
#ifndef __RTC_H__
#define __RTC_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "type.h"
/**
* 定义每个闹钟需占用的memory字节数,上层代码可据此以及需要支持的最大闹钟数分配memory空间
*/
#define MEM_SIZE_PER_ALARM 6
/**
* 定义闹钟最大数量,最多同时支持8个闹钟
*/
#define MAX_ALARM_NUM 2
/**
* 闹钟状态定义
*/
#define ALARM_STATUS_OPENED 0x01 /**< 打开状态 */
#define ALARM_STATUS_CLOSED 0x02 /**< 关闭状态 */
#define ALARM_STATUS_UNUSED 0x03 /**< 未使用状态 */
/**
* 闹钟模式定义
*/
typedef enum _RTC_ALARM_MODE
{
ALARM_MODE_ONCE_ONLY = 1, /**< 单次闹钟 */
ALARM_MODE_PER_DAY, /**< 每天闹钟 */
ALARM_MODE_PER_WEEK, /**< 每周闹钟 */
ALARM_MODE_WORKDAY, /**< 工作日闹钟 */
ALARM_MODE_USER_DEFINED, /**< 自定义闹钟 */
ALARM_MODE_MAX,
} RTC_ALARM_MODE;
#pragma pack(1) /*Ensure this structure is byte aligned, and not use padding bytes */
typedef struct _ALARM_INFO
{
uint32_t AlarmTimeAsSeconds;
uint8_t AlarmStatus : 2;
uint8_t AlarmMode : 4;
uint8_t AlarmData; //闹钟周期,bit0:星期天,bit6:星期六
} ALARM_TIME_INFO;
#pragma pack()
/**
* 阳历时间结构体定义
*/
typedef struct _RTC_DATE_TIME
{
uint16_t Year; /**< 阳历年 */
uint8_t Mon; /**< 阳历月 */
uint8_t Date; /**< 阳历日 */
uint8_t WDay; /**< 星期号,0代表周日,1~6代表周1到周6 */
uint8_t Hour; /**< 小时数 */
uint8_t Min; /**< 分钟数 */
uint8_t Sec; /**< 秒数 */
} RTC_DATE_TIME;
/**
* 农历时间结构体定义
*/
typedef struct _RTC_LUNAR_DATE
{
uint16_t Year; /**< 农历年 */
uint8_t Month; /**< 农历月 */
uint8_t Date; /**< 农历日 */
uint8_t MonthDays; /**< 农历每月的天数,30 or 29*/
bool IsLeapMonth; /**< 是否为闰月*/
} RTC_LUNAR_DATE;
/**
* @brief RTC模块初始化。
* @param AlarmWorkMem:上层代码为闹钟功能分配的memory空间的首地址。
* @param AlarmWorkMemSize:上层代码为闹钟功能分配的memory空间的大小。AlarmWorkMemSize由客户希望同时支持的最多
* 闹钟个数决定。每个闹钟需要的memory空间在rtc.h中由宏定义MEM_SIZE_PER_ALARM确定。比如客户需要最多支持
* 8个闹钟,那么上层分配的空间大小应为MEM_SIZE_PER_ALARM*8。上层的样例代码为:
* #define MAX_ALARM_NUM 8 //最多同时支持8个闹钟
* uint8_t AlarmWorkMem[MEM_SIZE_PER_ALARM * MAX_ALARM_NUM];
* RtcInit(AlarmWorkMem, MEM_SIZE_PER_ALARM * MAX_ALARM_NUM);
* @return NONE
*/
void RtcInit(uint8_t* AlarmWorkMem, uint8_t AlarmWorkMemSize);
/**
* @brief 获取当前时间
* @param 时间结构体指针,用于返回当前时间
* @return NONE
*/
void RtcGetCurrTime(RTC_DATE_TIME* CurrTime);
/**
* @brief 设置当前时间
* @param 时间结构体指针,为要设置的时间值
* @return NONE
*/
void RtcSetCurrTime(RTC_DATE_TIME* CurrTime);
/**
* @brief Get days count in the month of the year
* @param Year: the year number
* @param Month: the month number
* @return days count in the month of the year
*/
uint8_t RtcGetMonthDays(uint16_t Year, uint8_t Month);
/**
* @brief 获取某个闹钟的闹钟模式和闹钟时间
* @param AlarmTime:闹钟时间结构体指针,用于保存获取的闹钟时间
* @param AlarmMode: 闹钟模式指针,用于保存获取的闹钟模式
* @param ModeData: 周闹钟模式下闹钟有效的时间(周几,可以多个同时有效)
* @param AlarmID:闹钟号
* @return 如果执行成功返回TRUE,否则返回FALSE。
*/
bool RtcGetAlarmTime(uint8_t AlarmID, uint8_t* AlarmMode, uint8_t* AlarmData, RTC_DATE_TIME* AlarmTime);
/**
* @brief 设置某个闹钟的闹钟模式和闹钟时间
* @param AlarmTime:闹钟时间结构体指针,用于保存闹钟时间
* @param AlarmMode: 闹钟模式
* @param ModeData: 周闹钟模式下闹钟有效的时间(周几,可以多个同时有效)
* @param AlarmID:闹钟号
* @return 如果执行成功返回TRUE,否则返回FALSE。
*/
bool RtcSetAlarmTime(uint8_t AlarmID, uint8_t AlarmMode, uint8_t AlarmData, RTC_DATE_TIME* AlarmTime);
/**
* @brief 设置闹钟状态
* @param AlarmID:闹钟号
* @param AlarmStatus:要设置的闹钟状态
* @arg ALARM_STATUS_OPENED
* @arg ALARM_STATUS_CLOSED
* @arg ALARM_STATUS_UNUSED
* @return 如果执行成功返回TRUE,否则返回FALSE。
*/
bool RtcAlarmSetStatus(uint8_t AlarmID, uint8_t AlarmStatus);
/**
* @brief 获取闹钟的状态(打开/关闭/未使用)。
* @param AlarmID:闹钟号
* @return 返回闹钟状态。
* ALARM_STATUS_OPENED
* ALARM_STATUS_CLOSED
* ALARM_STATUS_UNUSED
*/
uint8_t RtcGetAlarmStatus(uint8_t AlarmID);
/**
* @brief 检查是否有闹钟到了。
* @param NONE
* @return 返回0表示没有闹钟到。返回大于0的值表示对应的闹钟到了
*/
uint8_t RtcCheckAlarmFlag(void);
/**
* @brief 清楚闹钟中断标志
* @param NONE
* @return NONE
*/
void RtcAlarmIntClear(void);
/**
* @brief 闹钟到时需要做的处理,上层接收到闹钟到的消息后,必须调用此函数。
* @param NONE
* @return NONE
*/
void RtcAlarmArrivedProcess(void);
/**
* @brief 阳历日期转农历日期
* @param DateTime:阳历时间结构体指针,作为输入参数
* @param LunarDate:农历时间结构体指针,作为输出参数
* @return NONE
*/
void SolarToLunar(RTC_DATE_TIME* DateTime, RTC_LUNAR_DATE* LunarDate);
/**
* @brief 获取农历年份的天干
* @param Year:农历年份
* @return 返回0-9, 分别对应天干: {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}
*/
uint8_t GetHeavenlyStem(uint16_t Year);
/**
* @brief 获取农历年份的地支
* @param Year:农历年份
* @return 返回0-11, 分别对应地支: {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}
* 分别对应生肖: {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"}
*/
uint8_t GetEarthlyBranch(uint16_t Year);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif