#ifndef BMS_SOX_H_
#define BMS_SOX_H_

#ifdef __cplusplus
extern "C" {
#endif 

#include "kit_macro.h"

typedef enum
{
    kSocStatus_Start = 0,
    kSocStatus_Normal = kSocStatus_Start,
    kSocStatus_Full,
    kSocStatus_Empty,
    kSocStatus_End,
}SocStatus;

// Ams 转换为 AH(0.1Ah/Bit)
#define SOX_CONVERT_AMS_TO_AH(value)    (((value) + 180000u) / 360000u)
// (0.1Ah/Bit) Ah 转换为 Ams
#define SOX_CONVERT_AH_TO_AMS(value)    ((uint64_t)(value) * 360000u)

typedef enum
{               
    kCumulateData_DayDisTime,
    kCumulateData_DayChgTime,
    
    kCumulateData_SigDisTime,
    kCumulateData_SigDisCap,
    kCumulateData_SigDisEnergy,
    kCumulateData_SigChgTime,
    kCumulateData_SigChgCap,
    kCumulateData_SigChgEnergy,

    kCumulateData_DayDisCap,     
    kCumulateData_DayDisEnergy,
    kCumulateData_DayChgCap,
    kCumulateData_DayChgEnergy,
    
    kCumulateData_AccDisTime,
    kCumulateData_AccDisCap,
    kCumulateData_AccDisEnergy,
    kCumulateData_AccChgTime,
    kCumulateData_AccChgCap,
    kCumulateData_AccChgEnergy,  
    kCumulateData_End,
}CumulateData;

void     bms_init_soc(void);
void     bms_integral_soc(int32_t current, uint16_t base_time);
void bms_poll_soh(uint32_t base_time);
SocStatus bms_get_soc_status(void);
void bms_set_soc_status(SocStatus st);
uint16_t bms_get_soc(void);
uint16_t bms_get_show_soc(void);
uint16_t bms_get_cycle_flag(void);
void bms_set_soc(uint16_t value);
uint16_t bms_get_soh(void);
uint16_t bms_get_cycle(void);
uint8_t bms_get_stat_day(void);
void bms_set_cycle(uint16_t value);
uint32_t bms_get_cumulate_data(CumulateData idx);
void bms_set_cumulate_data(CumulateData idx, uint32_t value);
uint16_t soh_init(uint16_t cycle, uint32_t dis_cap, uint32_t charge_cap);

#ifdef __cplusplus
}
#endif

#endif

