/*
 * @Description: 低功耗模块-svc层
 * @Author: yangsw
 * @Date: 2021-06-28 13:45:10
 * @LastEditTime: 2022-08-17 12:51:19
 * @LastEditors: 002389 yangsw@lierda.com
 * @Reference:
 */
#include "svc_lp.h"
#include "../../log/svc/svc_log.h"
#include "../../cloud/svc/svc_cloud.h"
#include "../../cloud/svc/svc_cloud_protocol.h"
#include "../../lcd/svc/svc_lcd.h"
#include "../../key/svc/svc_key.h"
#include "../../bat/app/app_bat.h"
#include "../../timer/svc/svc_timer.h"
#include "../../nb/svc/svc_nb_core.h"
#include "../../nb/svc/svc_nb_uart.h"
#include "../../lp/svc/svc_lp.h"
#include "../../rtc/svc/svc_rtc.h"
#include "../../ir/svc/svc_ir.h"
#include "../../ir/svc/svc_ir_uart.h"
#include "../../flash/svc/svc_flash.h"
#include "../../clock/svc/svc_clock.h"
#include "../../pulse/svc/svc_pulse_uart.h"
/**
 * @brief: 进入低功耗睡眠
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
static void Lp_Sleep(void)
{       
    Bsp_Flash_Into_Lp_Deal();
    Svc_Lcd_Into_Lp_Deal();
    Bsp_Nb_Into_Lp_Deal();
    Bsp_Ir_Into_Lp_Deal();
    Bsp_Bat_Into_Lp_Deal();
    Bsp_Log_Into_Lp_Deal();
    
    Bsp_Lp_Sleep();
}

/**
 * @brief: 进入低功耗睡眠
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
void Svc_Lp_No_Wakeup_Sleep(void)
{
    Svc_Log_Printf(LOG_INFO, "no wakeup sleep!");
    // disableInterrupts();    //关中断
    // Bsp_Lp_Halt_Clk();
    Bsp_Lp_Sleep();
}

/**
 * @brief: MCU是否忙
 * @param  {void}
 * @return {E_Result_Check} E_CHECK_OK：忙，E_CHECK_FAIL：空闲
 * @note:
 * @see:
 */
static E_Result_Check Is_Busy(void)
{
    /*云模块忙*/
    if ((Svc_Cloud_Is_Busy() == E_CHECK_OK) || (Svc_Cloud_Protocol_Has_More_Check() == E_CHECK_OK))
    {
        return E_CHECK_OK;
    }
    else
    {
        if (Svc_Nb_Core_Get_Cur_State() != E_NB_OFF)
        {
            Svc_Cloud_Set_Keep_Alive_Time(0);
            Svc_Nb_Core_Set_Cur_State(E_NB_OFF); // 设置NB状态为关机
            Svc_Nb_Faile_Reset();
            Svc_Cloud_Unlock_All_Event();                    // 解锁所有云事件
            Svc_Cloud_Clear_Event(E_CLOUD_EVENT_ALL);        // 清除所有云事件
            Svc_Nb_Core_Run_Clear_Event(NB_EVENT_COAP_SEND); // 清除NB发送udp数据事件
        }
    }
    /*按键模块忙*/
    if (Svc_Key_Is_Busy() == E_CHECK_OK)
    {
        return E_CHECK_OK;
    }
    /*红外模块忙*/
    if (Svc_Ir_Is_Busy() == E_CHECK_OK)
    {
        return E_CHECK_OK;
    }
    /*计量模块忙*/
    if (Svc_Pulse_Lpuart_Is_Busy() == E_CHECK_OK)
    {
        return E_CHECK_OK;
    }
    return E_CHECK_FAIL;
}

/**
 * @brief: 外设初始化
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
static void Func_Init(void)
{
    Svc_Log_Init();
    Svc_Timer_Init();
}

/**
 * @brief: 低功耗睡眠
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
void Svc_Lp_Sleep(void)
{
    /*MCU进入睡眠*/
    if (Is_Busy() == E_CHECK_FAIL)
    {
        Svc_Nb_Core_Set_Cur_State(E_NB_OFF); // 设置NB状态为关机
        Svc_Cloud_Unlock_All_Event();//解锁所有云事件
        Svc_Cloud_Clear_Event(E_CLOUD_EVENT_ALL);//清除所有云事件
        Lp_Sleep();
        Func_Init();
    }
}

