#include "sr_rtc.h"

#ifndef SR_USE_RTC_IN
#define SR_USE_RTC_IN
#endif

static BSP_RTC_INFO_T _rtcInfo[] =
	{
#ifdef SR_USE_RTC_IN
		{
			.name = "rtc0",
			.srId = SR_RTC0,

		},
#endif

#ifdef SR_USE_RTC_EX
		{
			.name = "rtce",
			.srId = SR_RTCE,

		},
#endif

};

static SR_RTC_DEV_T gs_rtcDevice[sizeof(_rtcInfo) / sizeof(BSP_RTC_INFO_T)] = {0};

SR_DEVICE_T *BspRtcOpen(SR_RTC_ID_E rtcId)
{
	uint8_t i;
	uint8_t devicenNum = sizeof(_rtcInfo) / sizeof(BSP_RTC_INFO_T);
	SR_RTC_DEV_T *rtcDev = SR_NULL;

	// 从事数组中查找adcId指定的设备
	for (i = 0; i < devicenNum; i++)
	{
		if (rtcId == _rtcInfo[i].srId)
		{
			rtcDev = &gs_rtcDevice[i];

			rtcDev->parent.deviceData = &_rtcInfo[i]; // 绑定设备数据

			break;
		}
	}

	return (rtcDev) ? &rtcDev->parent : SR_NULL;
}

int BspRtcClose(SR_DEVICE_T *dev)
{
	if(dev==SR_NULL) return SR_INVALID;
	return 0;
}

/**
 * @brief 获取rtc时间(UTC+0)
 *
 * @param time  日期时间结构体
 * @return 0成功，负值失败
 */
int BspRtcGet(SR_DEVICE_T *dev, SR_RTC_TIME_T *time)
{
	int ret = -1;
	struct tm tblock = {0};

	if (dev == SR_NULL || dev->deviceData == SR_NULL || time==SR_NULL) return SR_INVALID;

	BSP_RTC_INFO_T *rtcInfo = (BSP_RTC_INFO_T *)dev->deviceData;

	// hezhou:0 成功, 其他值为失败
	ret = luat_rtc_get(&tblock);

	if (!ret)
	{
		time->tmYear = tblock.tm_year + 1900;
		time->tmMon = tblock.tm_mon + 1;
		time->tmMday = tblock.tm_mday;
		time->tmHour = tblock.tm_hour;
		time->tmMin = tblock.tm_min;
		time->tmSec = tblock.tm_sec;
		time->tmWday = tblock.tm_wday + 1;
	}

	return (ret == 0) ? SR_OK : SR_FAIL;
}

/**
 * @brief 设置rtc时间(UTC+0)
 *
 * @param time  日期时间结构体
 * @return 0成功，负值失败
 */
int BspRtcSet(SR_DEVICE_T *dev, SR_RTC_TIME_T *time)
{
	int ret = -1;
	struct tm tblock = {0};

	if (dev == SR_NULL || dev->deviceData == SR_NULL || time==SR_NULL) return SR_INVALID;
	SR_ASSERT(IS_RTC_TIME(time));

	BSP_RTC_INFO_T *rtcInfo = (BSP_RTC_INFO_T *)dev->deviceData;

	tblock.tm_year = time->tmYear - 1900;
	tblock.tm_mon = time->tmMon - 1;
	tblock.tm_mday = time->tmMday;
	tblock.tm_hour = time->tmHour;
	tblock.tm_min = time->tmMin;
	tblock.tm_sec = time->tmSec;

	// hezhou:0 成功, 其他值为失败
	ret = luat_rtc_set(&tblock);

	return (ret == 0) ? SR_OK : SR_FAIL;
}
