/*
 * @Description: 电量采集模块-svc层
 * @Author: yangsw
 * @Date: 2021-06-02 09:30:10
 * @LastEditTime: 2024-01-10 14:48:17
 * @LastEditors: LiDa
 * @Reference: 
 */
#include "svc_bat.h"
#include "../../pulse/svc/svc_pulse.h"
#include "../../cloud/svc/svc_cloud_protocol.h"
#include "../../cloud/svc/svc_cloud.h"
#include "../../log/svc/svc_log.h"
#include "param/svc/svc_flash.h"
#include "../../led/app/app_led.h"

//static S_Bat s_bat;
S_Bat s_bat;
static void Batter_Init(void);
static void Batter_Factory_Init(void);
/**
 * @brief: 获取电量模块相关数据结构体
 * @param  {void} 
 * @return {S_Bat} 电量模块相关数据结构体
 * @note: 
 * @see: 
 */
S_Bat Svc_Bat_Get_Data(void){
    return s_bat;
}

/**
 * @brief: 电量模块初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Bat_Init(void){
    #if LOG_FUNC_ENABLE
        Svc_Log_Printf(LOG_DEBUG,"%s \r\n",__FUNCTION__);
    #endif
    Bsp_Bat_Init();
    Batter_Init();
    if(Svc_Com_Sys_Get_Work_Mode() == E_FactoryTestMode)
    {
        Batter_Factory_Init();
    }
}

/**
 * @brief: 电量模块唤醒后的初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Bat_Wakeup_Init(void){
    //Svc_Log_Printf(LOG_INFO,"%s",__FUNCTION__);
    Bsp_Bat_Init();


}
/**
 * @brief: 电量异常检查
 * @return {E_Result_Check} 检查结果
 * @note: 
 * @see: 
 * @param {gw_u32} u32Adc 电池电压，单位mV，1000=1000mV=1V
 */
E_Result_Check Bat_Check(gw_u32 u32Adc){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data();
    ps_flash->s_usage_info.s_day_usage.s_real_usage.u16BatVol=u32Adc/10;
    if(ps_flash->s_usage_info.s_day_usage.s_real_usage.u16BatVol  <  250 ){//掉电         
        Svc_Log_Printf(LOG_INFO,"Power Down %d",ps_flash->s_usage_info.s_day_usage.s_real_usage.u16BatVol);   
        ps_flash->s_usage_info.s_usage_alarm.u8BatAlarm=1;
		// Svc_Cloud_Resend_Reset();
		// Svc_Cloud_Post_Event(E_Cloud_Event_Upload);
        // SR_AppLedSetWork(LED_POWER_DOWN);
        return E_CHECK_FAIL;
    }    
    if(ps_flash->s_usage_info.s_day_usage.s_real_usage.u16BatVol <  ps_flash->s_para.u16BatAlarmVolt){//电量低于设定报警阈值 
        Svc_Log_Printf(LOG_INFO,"Power Low");  
        ps_flash->s_usage_info.s_usage_alarm.u8BatAlarm=1;
        // SR_AppLedSetWork(LED_POWER_DOWN);
		Svc_Log_Printf(LOG_WARNING,"%s->u8BatAlarm!!", __FUNCTION__);//<<<<<<<<<测试用
        return E_CHECK_FAIL;
    } 
    return E_CHECK_OK;
}

/**
 * @brief: 电量相关数据初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
static void Batter_Init(void)
{
    gw_u32 u32Adc;
    // u32Adc=Bsp_Bat_Get_Adc(); //获取电池电压值
    // // Svc_Log_Printf(LOG_INFO,"%d",u32Adc);
    // s_bat.u16BatValtage=u32Adc/10;
    // while(1)
    // {
        Svc_Com_Delay_Ms(500,64);
        u32Adc=Bsp_Bat_Get_Adc(); //获取电池电压值
        #if LOG_FUNC_ENABLE
            Svc_Log_Printf(LOG_INFO,"%d",u32Adc);
        #endif
        s_bat.u16BatValtage=u32Adc/10;         
        // if(s_bat.u16BatValtage > 320)
        // {
        //     break;
        // }
    // }
}

/**
 * @brief: 电量相关数据初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
static void Batter_Factory_Init(void)
{
    gw_u32 u32Adc;
    u32Adc=Bsp_Bat_Get_Adc(); //获取电池电压值
    // Svc_Log_Printf(LOG_INFO,"%d",u32Adc);
    s_bat.u16BatValtage=u32Adc/10;
    while(1)
    {
        Svc_Com_Delay_Ms(500,64);
        u32Adc=Bsp_Bat_Get_Adc(); //获取电池电压值
        #if LOG_FUNC_ENABLE
            Svc_Log_Printf(LOG_INFO,"%d",u32Adc);
        #endif
        s_bat.u16BatValtage=u32Adc/10;         
        if(s_bat.u16BatValtage > 320)
        {
            break;
        }
    }
}

/**
 * @brief: 电量检测定时器回调
 * @param  {void}
 * @return {void}
 * @note: 每1s执行一次
 * @see: 
 */
void Svc_Bat_Timer_Callback(void){
    if(s_bat.u8TimeCnt>0){
       s_bat.u8TimeCnt--; 
    }
}

/**
 * @brief: 电量检查-每2s检测一次
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Bat_Check(void){
    gw_u32 u32Adc;
    if(s_bat.u8TimeCnt>0){
        return;
    }
    s_bat.u8TimeCnt=60;
	if((Svc_Cloud_Is_Busy()==E_CHECK_OK)||(Svc_Cloud_Wait_Cmd())){
		return ;
    }  
    u32Adc=Bsp_Bat_Get_Adc();                 //采集当前实际电压
    s_bat.u16BatValtage=u32Adc/10;
    // Svc_Log_Printf(LOG_INFO,"%d",u32Adc);
    //Bat_Check(u32Adc,(gw_u8)Batter_Value.device_bat);
    Bat_Check(u32Adc);
    //Bsp_Com_Rst_Reason();
      
}


/**
 * @brief: 电量检查时间清除，立即检测
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Bat_Real_Time(void){
  if(s_bat.u8Cnt>=1){
    s_bat.u8TimeCnt=0;
    s_bat.u8Cnt=0;
  }else{
    s_bat.u8Cnt++;
  }
}
