/*
 * inflash.h
 *
 *  Created on: 2024年6月24日
 *      Author: psx
 */

#ifndef APP_INC_INFLASH_H_
#define APP_INC_INFLASH_H_

#include "debug.h"

#pragma pack(push,1)

typedef struct _uint8_config_info{
    uint8_t start_Flag[2];              /* 起始标志  */
    uint8_t address[7];                 /* 地址 */
    uint8_t end_Flag;                   /* 结束标志 */
    uint8_t Access_Node_Type[2];        /* 接入节点类型  */
    uint8_t Communication_Methods[2];   /* 通信方式  */
    uint8_t bat485_Baud[4];             /* 串口波特率,为0代表bms不支持通信 */
    uint8_t gw485_Baud[4];              /* 串口波特率 */
    uint8_t ConstantCurrentV[2];        /* 高于该(电压 / 100),小于ConstantVoltageV * 100电压进行恒流充电 */
    uint8_t ConstantVoltageV[2];        /* 高于该(电压 / 100)且电流大于FloatI * 100进行恒压充电 */
    uint8_t FloatI[2];                  /* 高于该(电压 / 100)且电流低于FloatI * 100进行浮充充电 */
    uint8_t startSolarOpenCircuitV[2];  /* 高于该(电压 / 100)开始充电 */
}uint8_config_info;


//typedef struct _config_info{
//    uint8_t  start_Flag[2];         /* 起始标志  */
//    uint8_t  address[7];            /* 地址 */
//    uint8_t  end_Flag;              /* 结束标志 */
//    uint16_t Access_Node_Type;      /* 接入节点类型  */
//    uint16_t Communication_Methods; /* 通信方式  */
//    uint32_t bat485_Baud;           /* 串口波特率 */
//    uint32_t gw485_Baud;            /* 串口波特率 */
//    uint16_t ConstantCurrentV;      /* 高于该(电压 / 100),小于ConstantVoltageV / 100电压进行恒流充电 */
//    uint16_t ConstantVoltageV;      /* 高于该(电压 / 100)且电流大于FloatI / 100进行恒压充电 */
//    uint16_t FloatI;                /* 高于该(电压 / 100)且电流低于FloatI / 100进行浮充充电 */
//    uint16_t startSolarOpenCircuitV;/* 高于该(电压 / 100)开始充电 */
//}config_info;

typedef struct _config_info{
    uint8_t  start_Flag[2];                 /* 起始标志  */
    uint8_t  address[7];                    /* 地址 */
    uint32_t baud_485;                      /* 串口波特率 */
    uint16_t constantCurrentV;              /* 电压高于(ConstantCurrentV / 100 + 0.4),小于（ConstantVoltageV / 100 - 0.4）进入mppt模式 */
    uint16_t constantVoltageV;              /* 电压高于该(ConstantVoltageV / 100)且电流大于（FloatI / 100 + 0.1）进行恒压充电 */
    uint16_t floatI;                        /* 电压高于该(ConstantVoltageV / 100)且电流低于（FloatI / 100）进行浮充充电 */
    uint16_t startSolarOpenCircuitV;        /* 太阳能板开路电压高于该(电压 / 100)开始充电 */
    uint16_t stopSolarOpenCircuitV;         /* 太阳能板开路电压高于该(电压 / 100)停止充电 */
    uint16_t noBatteryChargeV;              /* 没有电池时的输出电压 */
    uint16_t FloatTime;                     /* 浮充时间(秒) */
    uint16_t checkSolarOpenCircuitVTime;    /* 启动任务中太阳能板开路电压检测时间 */
    uint16_t registerRefreshTime;           /* 寄存器数据刷新时间 */
    uint16_t resRefreshTime;                /* 线阻计算间隔时长 */
    uint16_t sensorEnableBroadcastTime;     /* 传感器运行再次注册的间隔 */
    uint16_t HighSideMosTemperature_stop;   /* 当上桥温度达到该值时，停止输出 */
    uint16_t HighSideMosTemperature_end;    /* 当上桥温度上升到该值时，输出稳定在12V，降低功率运行 */
    uint16_t HighSideMosTemperature_start;  /* 当上桥温度降低到该值时，按照正常情况输出 */
    uint8_t  end_Flag;                      /* 结束标志 */
}config_info;
#define CONFIG_INFO_SIZE    (sizeof(config_info))
#pragma pack(pop)

extern config_info g_slConfigInfo;

#define FLASH_SAVE_ADDR_BEGIN   (0x00)
#define FLASH_SAVE_ADDR_END     (0x00 + CONFIG_INFO_SIZE)

void save_config_info(config_info save_config_info);
uint8_t read_config_info(void);


#endif /* APP_INC_INFLASH_H_ */
