#include "sr_pm.h"

#include "sr_config.h"

#include "sr_stddef.h"

#include "sr_log.h"


/**
 * @brief 休眠请求
 * @param sleepMode 休眠模式
 * @return 0成功，负值失败
 */
int BspPmSleepReq(SR_PM_SLEEP_MODE_E sleepMode)
{
   int ret =-1;

   SR_ASSERT(IS_SLEEP_MODE(sleepMode));

   luat_pm_power_ctrl(LUAT_PM_POWER_USB, 0);   //插着USB的时候需要关闭USB电源
   
   //hehzou: 0成功，其他失败 
   ret = luat_pm_force(sleepMode);
   
   return (ret==0)? SR_OK:SR_FAIL;
}



/**
 * @brief 启动低功耗定时器,在休眠模式下依然生效. 只触发一次
 * @param id 定时器id
 * @param timeout 定时时长, 单位毫秒
 * @return 0成功，负值失败
 */
int BspPmLtimerStart(SR_LTIMER_ID_E id, uint32_t timeout)
{
    int ret=-1;
	if(((uint32_t)id)>=LTIMER_MAX) return SR_INVALID;

	//先stop
	luat_pm_dtimer_stop(id);
	
    //hezhou:0成功，其他失败
	ret = luat_pm_dtimer_start(id,timeout);
    
	return (ret==0)? SR_OK:SR_FAIL;
}


/**
 * @brief 停止低功耗定时器
 * @param id 定时器id
 * @return 0成功，负值失败
 */
int BspPmLtimerStop(SR_LTIMER_ID_E id)
{
    int ret=-1;
	if(((uint32_t)id)>=LTIMER_MAX) return SR_INVALID;
	
    //hezhou:0成功，其他失败
	ret = luat_pm_dtimer_stop(id);
	
	return (ret==0)? SR_OK:SR_FAIL;
}



/**
 * @brief 关机
 * 
 * @return 0成功，负值失败
 */
int BspPmPowerOff_(void)
{
  return luat_pm_poweroff();

}



/**
 * @brief 复位重启
 * 
 * @return 0成功，负值失败
 */
int BspPmReset(void)
{
  return luat_pm_reset();

}



/**
 * @brief 开机原因查询
 * @return  见SR_WAKEUP_REASON_E
 */
SR_WAKEUP_REASON_E BspPmGetPoweronReason(void)
{
    SR_WAKEUP_REASON_E srReason = SR_WK_UNKNOW;
	LUAT_PM_POWERON_REASON_E pwrReason;
	int lastState, rtcOrPad;

	
	pwrReason = luat_pm_get_poweron_reason();
	luat_pm_last_state(&lastState, &rtcOrPad);
	SR_LOG_INFO("[BSP] pwrReason = %d, lastState = %d, rtcOrPad = %d.", pwrReason, lastState, rtcOrPad);

	if ((lastState == 0) && (rtcOrPad == 0))
	{
		if (pwrReason == LUAT_PM_POWERON_REASON_NORMAL)
		{
			srReason = SR_WK_POR;
		}
		if (pwrReason == LUAT_PM_POWERON_REASON_SWRESET)
		{
			srReason = SR_WK_SWRESET;
		}
	}
	else if ((lastState == 3) && (rtcOrPad == 1))
	{
		srReason = SR_WK_TIMER;
	}
	else if ((lastState == 3) && (rtcOrPad == 2))
	{
		srReason = SR_WK_INTERRUPT;

	}
	else if ((lastState == 3) && (rtcOrPad == 5))
	{
		srReason = SR_WK_PWRKEY;
	}

	//充电唤醒


	return srReason;

}



