/*
 * @Description: 电量采集模块-svc层
 * @Author: yangsw
 * @Date: 2021-06-02 09:30:10
 * @LastEditTime: 2022-08-04 15:00:15
 * @LastEditors: 002389 yangsw@lierda.com
 * @Reference:
 */
#include "svc_bat.h"
#include "../../cloud/svc/svc_cloud_protocol.h"
#include "../../cloud/svc/svc_cloud.h"
#include "../../log/svc/svc_log.h"
#include "../../flash/svc/svc_flash.h"
#include "../../lcd/svc/svc_lcd.h"
#include "../../nb/svc/svc_nb_core.h"
static S_Bat s_bat;

/**
 * @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)
{
  Svc_Bat_Check();
}

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

/**
 * @brief: 电量相关数据初始化
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
void Batter_Init(void)
{
  gw_u32 u32Adc;
  /*前几次的值可能不准，空踩几次*/
  for (gw_u8 i = 0; i < 2; i++)
  {
    u32Adc = Bsp_Bat_Get_Adc(); // 获取电池电压值
  }
  s_bat.u16BatValtage = u32Adc;
  //  Svc_Log_Printf(LOG_INFO, "u16BatValtage:%d", s_bat.u16BatValtage);
}

/**
 * @brief: 电量异常检查
 * @return {E_Result_Check} 检查结果
 * @note:
 * @see:
 * @param {gw_u32} u32Adc 电池电压，单位mV，1000=1000mV=1V
 */
void 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_realtime_usage.u16BatVoltage = u32Adc;

  if (u32Adc < BAT_FLASH_LOW) // 低电压导致不能操作flash，无法记录，无法上报，液晶显示
  {
    if (ps_flash->u8flashCheckFail == 0)
    {
      Svc_Log_Printf(LOG_INFO, "Power So Low %d", u32Adc);
      Svc_Flash_Set_Device_Alarm(b1Power2);
      s_bat.e_power_state = E_Power_Down;
      ps_flash->u8flashCheckFail = 1;
    }
  }
  else if (u32Adc < ps_flash->s_para.battery1_second_low_voltage_threshold) // 二级低压，不上报，事件记录
  {
    if(ps_flash->s_other.e_up_reason != E_UR_PowerUp)//处于掉电状态非上电上报并时，中断上报，上电上报失败没关系，时间校准就行
    {	
        ps_flash->s_other.e_up_reason = E_UR_Null;           //清除上传事件
        Svc_Cloud_Clear_Event(E_CLOUD_EVENT_ALL); // 清除所有云事件
        Svc_Cloud_Clear_Rsp_Cnt();
        Svc_Nb_Core_Run_Clear_Event(NB_EVENT_COAP_SEND); // 清除NB发送udp数据事件
        Svc_Lcd_Display_Comm_Process(E_Lcd_UP_FAIL, WAIT_REFRESH_TIME);       //lcd显示上传失败
        
    }
    if (Svc_Flash_IsDevice_Alarm(b1Power2) == 0) // 原来没有二级低压，防止重复进行上报和事件记录
    {
      Svc_Log_Printf(LOG_INFO, "Power Sec Low %d", u32Adc);
      Svc_Flash_Set_Device_Alarm(b1Power2);
      Svc_Flash_Save_Meter_Event(E_Event_Power_Alarm_2);
      s_bat.e_power_state = E_Power_Low_2;
    }
  }
  else if (u32Adc < ps_flash->s_para.battery1_first_low_voltage_threshold) // 一级低压，上报，事件记录
  {
    if (Svc_Flash_IsDevice_Alarm(b0Pwoer1) == 0) // 原来没有一级低压，防止重复进行上报和事件记录
    {
      Svc_Log_Printf(LOG_INFO, "Power Fir Low");
      Svc_Flash_Set_Device_Alarm(b0Pwoer1);
      Svc_Flash_Save_Meter_Event(E_Event_Power_Alarm_1);
      s_bat.e_power_state = E_Power_Low_1;
    }
  }
  else if (u32Adc < BAT_FLASH_COMMON)
  {
    s_bat.e_power_state = E_Power_Normal2;
  }
  else if (u32Adc >= BAT_FLASH_COMMON)
  {
    s_bat.e_power_state = E_Power_Normal1;
  }

  /*事件清除*/
  if (u32Adc > BAT_FLASH_LOW + 100)
  {
    if (ps_flash->u8flashCheckFail == 1)
    {
      Svc_Log_Printf(LOG_INFO, "flash save recover %d", u32Adc);
      ps_flash->u8flashCheckFail = 0;
    }
  }
  if (u32Adc > ps_flash->s_para.battery1_second_low_voltage_threshold + 100)
  {
    if (Svc_Flash_IsDevice_Alarm(b1Power2) == 1)
    {
      Svc_Log_Printf(LOG_INFO, "Power Sec Low remove %d", u32Adc);
      Svc_Flash_Clear_Device_Alarm(b1Power2);
    }
  }
  if (u32Adc > ps_flash->s_para.battery1_first_low_voltage_threshold + 100)
  {
    if (Svc_Flash_IsDevice_Alarm(b0Pwoer1) == 1)
    {
      Svc_Log_Printf(LOG_INFO, "Power Fir Low remove %d", u32Adc);
      Svc_Flash_Clear_Device_Alarm(b0Pwoer1);
    }
  }
}

/**
 * @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;
  }
  Bsp_Bat_Init();
  Batter_Init();
  s_bat.u8TimeCnt = 5;
  u32Adc = Bsp_Bat_Get_Adc(); // 采集当前实际电压
  s_bat.u16BatValtage = u32Adc;
  Bat_Check(s_bat.u16BatValtage);
  //  Svc_Log_Printf(LOG_INFO, "u16BatValtage:%d", s_bat.u16BatValtage);
}

/**
 * @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++;
  }
}

/**
 * @brief: 电量检查转化为百分比
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
gw_u8 Svc_Bat_Valtage_Level(gw_u16 u16BatValtage)
{
  return 0;
}
