#ifndef BL_PARAMETER_H_
#define BL_PARAMETER_H_

#include "main.h"
#include "comm_types.h"
#include "chargControlTypes.h"
#include "configParameter.h"

// #pragma pack(push,1)

/* 主要有配置文件读取出来的数据 */
typedef struct _config_parameter{
    uint8_t uniqueDeviceID[7];                      /* 设备唯一ID */

    uint32_t gw485_Baud;                            /* 串口波特率 */
    uint32_t bat485_Baud;                           /* 串口波特率,为0代表bms不支持通信 */
    uint32_t supportProtocolTypes;                  /* 支持协议类型 */

    uint8_t powerBoxType;                           /* 是否只充当电源板：0x00:不是；0xFF：是*/
    float constantVoltageV;                         /* 恒压充电阈值电压(V) */
    float floatI;                                   /* 浮充充电阈值电流(A) */
    float startSolarOpenCircuitV;                   /* 启动充电太阳能板开路电压(V) */
    float stopSolarOutputCircuitV;                  /* 停止充电太阳能板输出电压(V) */
    uint16_t checkCanStartTime;                     /* 检测能否启动间隔时间(S) */
    uint16_t shortCircuitJudgmentDelay;             /* 短路判断延时(S) */
    uint16_t inputPowerLowJudgmentDelay;            /* 前端输入功率不足判断延时(S) */
    uint16_t inputPowerLowAgainOutputDelay;         /* 前端输入功率不足再次输出延时(S) */
    uint16_t firstStageProtectionDelay;             /* 第一段保护延时(10uS) */
    float firstStageProtectionCurr;                 /* 第一段保护电流(A) */
    uint16_t firstStageProtectionValue;             /* 第一段保护ADC值 */
    uint16_t secondStageProtectionDelay;            /* 第二段保护延时(100uS) */
    float secondStageProtectionCurr;                /* 第二段保护电流(A) */
    uint32_t thirdStageProtectionDelay;             /* 第三段保护延时(100uS) */
    float thirdStageProtectionCurr;                 /* 第三段保护电流(A) */
    uint16_t inputPowerLowDetectionDelay;           /* 前端输入功率不足检测延时(100uS) */
    float inputPowerLowDetectionVolt;               /* 前端输入功率不足检测电压(V) */
    float maxOpenSolarOutputCircuitV;               /* 最大太阳能板输出电压(V) */
    float maxChargCurr;                             /* 最大充电电流(A) */
    float minCheckLoopImpedanceChargCurr;           /* 检测回路阻抗时的最小充电电流(A) */
    float fullPowerOutputTemperature;               /* 满功率输出温度(℃) */
    float reducePowerOutputTemperature;             /* 降功率输出温度(℃) */
    float stopPowerOutputTemperature;               /* 停止输出温度(℃) */
    float constantVoltageChargeV;                   /* 恒压充电时的输出电压(V) */
    float FloatChargeV;                             /* 浮充充电时的输出电压(V) */
    uint16_t collectOpenCircuitVoltageTime;         /* 充电时采集开路电压的间隔时间 */
    float reverseChargProtectionCurr;               /* 反向充电保护电流 */
    
    float softStartVolt;                            /* 软启动阈值电压 */
    float MPPTConstantVoltage;                      /* MPPT恒定输出电压 */
    float MPPTReduceConstantVoltage;                /* MPPT降功率运行时控制输入电压稳定值 */
    float underVoltageProtection;                   /* 电池欠压保护电压 */

    /* SL */
    uint16_t Access_Node_Type;              /* 接入节点类型  */
    uint16_t Communication_Methods;         /* 通信方式  */
    uint8_t startFlagSL[2];                 /* 起始标志  */
    uint8_t endFlagSL;                      /* 结束标志  */
} config_parameter;
extern config_parameter g_cfgParameter;
typedef struct _otherParameter{
    float Battery_Voltage;                /* 电池电压  (V) */
    float Output_Voltage;                 /* 输出电压 */
    float Charg_Current;                  /* 充电电流（流向电池+负载）  (A) */
    float Discharg_Current;               /* 放电电流（流向负载）  (A) */
    float Input_Voltage;                  /* 系统输入电压  (V) */
    float Solar_Open_Circuit_Voltage;     /* 太阳能板开路电压  (V) */
    float HighSideMos_Temperature;        /* 高端mos的温度  (°C) */
    float Solar_In_Circuit_Voltage;       /* 太阳能板输入电压  (V) */

    float totalElectricityConsumption;    /* 总电量消耗(W*H) */
    float totalChargCapacity;             /* 总充电电量(W*H) */
    float SOC;                            /* 剩余电量 */

    int MPPT_Mode;                        /* 工作模式 */

    uint8_t versionInformation[13];       /* 软件版本信息 */

    float loopImpedance;                  /* 回路阻抗大小  (Ω) */

    uint16_t Registration_Status;         /* 注册状态  */
}otherParameter;

// #pragma pack(pop)


BOOL getBatteryState(void);
void setBatteryState(BOOL state);
float getDutyRatio(void);
void setDutyRatio(float DutyRatio);
void setDutyRatioToZero(void);
uint8_t getMosTemperState(void);
void setMosTemperState(uint8_t state);
BOOL getCheckImpedanceState(void);
void setCheckImpedanceState(void);
void resetCheckImpedanceState(void);
void setLastTime(timeInfo time);
timeInfo getLastTime(void);

float getBatteryVoltage(void);
void setBatteryVoltage(void);
float getOutputVoltage(void);
void setOutputVoltage(void);
float getChargCurrent(void);
void setChargCurrent(void);
float getDischargCurrent(void);
void setDischargCurrent(void);
float getInputVoltage(void);
void setInputVoltage(void);
float getSolarOpenCircuitVoltage(void);
void setSolarOpenCircuitVoltage(void);
float getHighSideMosTemperature(void);
void setHighSideMosTemperature(void);
float getSolarInCircuitVoltage(void);
void setSolarInCircuitVoltage(void);
float getTotalElectricityConsumption(void);
void setTotalElectricityConsumption(void);
void totalElectricityConsumptionInt(float totalPower);
float getTotalChargCapacity(void);
void setTotalChargCapacity(void);
void totalChargCapacityInt(float totalPower);
float getSOC(void);
void setSOC(void);
int getMPPT_Mode(void);
void setMPPT_Mode(int MPPT_Mode);
float getChargBatteryCurrent(void);
BOOL getChargMosState(void);
void setChargMosState(BOOL state);
BOOL getDischargMosState(void);
uint8_t *getVersionnInformation(void);
float getLoopImpedance(void);
BOOL setLoopImpedance(float loopImpedance);
uint16_t getRegistrationStatus(void);
void setRegistrationStatus(uint16_t status);

void setExChargeCurr(void);
float getExChargeCurr(void);

#endif