/**
*@file    sr_pm.h
*@brief   PM电源管理抽象接口头文件
*@details 提供pm相关抽象接口、枚举
*@copyright Copyright (c) 2024 lierda. All rights reserved. 
*@author  Lierda-RDC
*@date    2024-04-18
*@example ZhaoyangSDK\example\pal\hal\pm_example.c
*/

#ifndef _SR_HAL_PM_H
#define _SR_HAL_PM_H

#include "sr_config.h"

#ifdef SR_USE_PM

typedef enum SR_WAKEUP_REASON  SR_WAKEUP_REASON_E;
typedef enum SR_PM_SLEEP_MODE  SR_PM_SLEEP_MODE_E;

#include "sr_bsp_pm.h"



/**
* @brief 开机原因
*/
enum SR_WAKEUP_REASON
{
    SR_WK_POR = 0,    /*!<上电复位*/
    SR_WK_TIMER,      /*!<低功耗定时器唤醒*/
    SR_WK_PWRKEY,     /*!<POWKE_KEY按键唤醒*/
    //SR_WK_CHARG,      /*!<充电唤醒*/
    SR_WK_INTERRUPT,  /*!<WAKEUP中断唤醒*/
    SR_WK_SWRESET,    /*!<软件复位*/
    SR_WK_UNKNOW,     /*!<未知原因*/
};


/**
* @brief 休眠模式
* @note  因各家芯片差异，功耗管理的实现也不尽相同，
*        下面的描述仅给出一些推荐的场景，并非一定需要实现所有。开发者可根据芯片自身情况选择其中的几种进行实现，但是需要遵循级别越高，功耗越低的原则！
*/
enum SR_PM_SLEEP_MODE
{
  SR_PM_SLEEP_NONE     = BSP_PM_SLEEP_NONE,	   /*!<系统处于活跃状态，未采取任何的降低功耗措施*/
  SR_PM_SLEEP_IDLE     = BSP_PM_SLEEP_IDLE,	   /*!<空闲模式。关闭部分时钟，代码依然在执行*/
  SR_PM_SLEEP_LIGHT    = BSP_PM_SLEEP_LIGHT,   /*!<轻度睡眠模式，内核停止工作，外设仍然工作，可被任意中断/事件唤醒，唤醒后从休眠处继续运行*/
  SR_PM_SLEEP_DEEP     = BSP_PM_SLEEP_DEEP,	   /*!<停止模式/深度休眠模式，内核停止，大部分外设停止，仅少数低功耗外设工作，可被中断唤醒，唤醒后从休眠处继续运行或复位（看芯片平台）*/
  SR_PM_SLEEP_STANDBY  = BSP_PM_SLEEP_STANDBY, /*!<待机模式，内核停止，大部分外设停止，仅少数低功耗外设工作，电源域关闭，唤醒后通常复位*/
};


/*****************抽象接口*****************************************/
/**
 * @brief 休眠请求
 * @param sleepMode 休眠模式，SR_PM_SLEEP_MODE_E枚举类型
 * @return 0成功，负值失败
 */
#define SR_HalPmSleepReq(sleepMode)  BspPmSleepReq(sleepMode)




/**
 * @brief 启动低功耗定时器,在休眠模式下依然生效. 只触发一次
 * @param id 定时器id，SR_LTIMER_ID_E枚举类型
 * @param timeout 定时时长, 单位毫秒
 * @return 0成功，负值失败
 */
#define SR_HalPmLtimerStart(id,timeout)  BspPmLtimerStart( id,timeout)



/**
 * @brief 停止低功耗定时器
 * @param id 定时器id，SR_LTIMER_ID_E枚举类型
 * @return 0成功，负值失败
 */
#define SR_HalPmLtimerStop(id)  BspPmLtimerStop(id)



/**
 * @brief 开机原因查询
 * @return  枚举类型SR_WAKEUP_REASON_E
 */
#define  SR_HalPmGetPoweronReason()   BspPmGetPoweronReason()



/**
 * @brief 关机
 * 
 * @return 0成功，负值失败
 */
 #define SR_HalPmPowerOff()  BspPmPowerOff_()    



/**
 * @brief 复位重启
 * 
 * @return 0成功，负值失败
 */
#define SR_HalPmReset()      BspPmReset()


#endif


#endif

