#ifndef _HISTORY_RCD_H
#define _HISTORY_RCD_H
#define HIS_FILE_VER "v1.0"
#define EOF_LEN 1 //0x0A“文件结束”(EOF)标志 的长度
#define R_N_LEN 2 //"\r\n" 的长度
#define MSG_SOE_RCD_LEN strlen("第0001条SOE:0x0014,1,2018-07-26 10:29:31.109\r\n")
#define MSG_CO_RCD_LEN strlen("第0001条遥控操作记录:0x6001,选择 ,合,2018-07-26 11:43:48.420\r\n")
#define MSG_EXV_RCD_LEN strlen("0x4001,00000.000,2017-03-14 15:53:34.162,")
#define MSG_FIX_RCD_LEN strlen("0x4001,00000.000,")
#define MSG_FLOWREV_RCD_LEN strlen("0x6409,00000.000,2017-03-14 15:53:34.162,")
#define MSG_FRZ_RCD_LEN strlen("0x6409,00000.000,")
//soe记录条数n(两个字节)?
#define MSG_SOE_FILE_HEAD_LEN strlen("文件头:soe.msg,v1.0\r\nD30XXXXZN000201703100002,1024,02\r\n")
#define MSG_CO_FILE_HEAD_LEN strlen("文件头:co.msg,v1.0\r\nD30XXXXZN000201703100002,1024,02\r\n")
#define MSG_EXV_FILE_HEAD_LEN strlen("文件头:exvXXXXXXXX.msg,v1.0\r\nD30XXXXZN000201703100002,170507,02\r\n")
#define MSG_FIX_FILE_HEAD_LEN strlen("文件头:fixptXXXXXXXX.msg,v1.0\r\nD30XXXXZN000201703100002,170507,1024,02\r\n")
#define MSG_FRZ_FILE_HEAD_LEN strlen("文件头:frzXXXXXXXX.msg,v1.0\r\nD30XXXXZN000201703100002,170507,1024,02\r\n")
#define MSG_FLOWREV_FILE_HEAD_LEN strlen("文件头:flowrev.msg,v1.0\r\nD30XXXXZN000201703100002,170507,02\r\n")
#define MSG_LOG_FILE_HEAD_LEN strlen("文件头:D30XXXXZN000201703100002,1024\r\n")
#define MSG_FIX_PART_ID_OFFSET strlen("文件头:fixptXXXXXXXX.msg,v1.0\r\nD30XXXXZN000201703100002,170507,")
#define MSG_FRZ_PART_ID_OFFSET strlen("文件头:frzXXXXXXXX.msg,v1.0\r\nD30XXXXZN000201703100002,170507,")
#define SOE_RCD_NUM_OFFSET strlen("文件头:soe.msg,v1.0\r\nD30XXXXZN000201703100002,")
#define CO_RCD_NUM_OFFSET strlen("文件头:co.msg,v1.0\r\nD30XXXXZN000201703100002,")
#define MSG_LOG_RCD_NUM_OFFSET strlen("文件头:D30XXXXZN000201703100002,")
#define SOE_RCD_NUM 1024
#define CO_RCD_NUM 32
#define LOG_RCD_NUM 1024
#define FIX_RCD_NUM 96
#define FRZ_RCD_NUM 96
#define FLOWREV_RCD_NUM 256
#define EXV_FILE_NUM_MAX 31
#define FIXPT_FILE_NUM_MAX 31
#define FRZ_FILE_NUM_MAX 31
#define FLOWREV_FRONT_PART_NUM 256 //文件前面保存下的节点数
#define XML_SOE_FILE_HEAD_LEN strlen("\r\n\r\n \r\n \r\n \r\n\r\n")//38+2+10+2+63+2+1+20+2+1+10+2+1+11+2
#define XML_CO_FILE_HEAD_LEN strlen("\r\n\r\n \r\n \r\n \r\n\r\n")
#define XML_EXV_FILE_HEAD_LEN strlen("\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n")
#define XML_FLOWREV_FILE_HEAD_LEN strlen("\r\n\r\n \r\n \r\n \r\n\r\n")
#define XML_LOG_FILE_HEAD_LEN strlen("\r\n \r\n")
#define XML_SOE_RCD_LEN strlen(" \r\n")
#define XML_CO_RCD_LEN strlen(" \r\n")
#define XML_EXV_RCD_LEN strlen(" \r\n \r\n")
#define XML_FLOWREV_RCD_LEN strlen(" ")
#define XML_LOG_RCD_LEN strlen(" ")
#define XML_FIX_DATAREC_LEN strlen(" \r\n \r\n")
#define XML_FIX_SECT_LEN strlen(" \r\n")
#define XML_FIX_ATTR_LEN strlen(" \r\n")
#define XML_FIX_FILE_FIX_LEN strlen("\r\n\r\n \r\n \r\n \r\n\r\n")
#define XML_FIX_ATTR_LEN strlen(" \r\n")
#define XML_FRZ_ATTR_LEN strlen(" ")
#define XML_FRZ_SECT_LEN strlen(" \r\n")
#define XML_FRZ_MIN_DATAREC_LEN strlen(" \r\n \r\n")
#define XML_FRZ_DAY_DATAREC_LEN strlen(" \r\n \r\n")
#define XML_FRZ_FILE_FIX_LEN strlen("\r\n\r\n \r\n \r\n \r\n \r\n")
enum
{
HS_FILE_SOE = 0, // SOE记录文件
HS_FILE_CO, // 遥控记录文件
HS_FILE_FIXPT, // 定点遥测记录文件
HS_FILE_EXV, // 极值记录文件
HS_FILE_FRZ,
HS_FILE_FLOWREV,
HS_FILE_LOG,
HS_FILE_NUM
};
struct exv_rcd_data
{
u16 cp; // 信息对象地址
float elem_val; // 信息元素值(归一化值)
struct rtc_time_t time_mark; // 时标
};
#define EXV_NUM_MAX UI_NUM + SW_AC_NUM_ALL * SWITCH_NUM_MAX
struct exv_rcd_t
{
struct rtc_time_t time_bk; // 文件日期
u32 max_num; // 最大值信息对象数目n
struct exv_rcd_data max_data[EXV_NUM_MAX];
float max_value_bk[EXV_NUM_MAX];
u32 min_num; // 最小值信息对象数目n
struct exv_rcd_data min_data[EXV_NUM_MAX];
float min_value_bk[EXV_NUM_MAX];
u8 ac_num;
bool save_flag;
bool occur_flag;
};
#define FIXPT_RCD_NUM UI_NUM + SW_AC_NUM_ALL *SWITCH_NUM_MAX
struct fixpt_rcd_data
{
u16 cp;
float elem_val; // 信息元素值(浮点数值)
};
struct fixpt_rcd_t
{
struct rtc_time_t time_bk; // 定点时刻
u8 info_num; // 定点信息对象数目
struct fixpt_rcd_data data[FIXPT_RCD_NUM];
};
/****************************日冻结电能量记录文件****************************/
struct frz_rcd_data
{
u16 cp;
float elem_val; // 信息元素值(浮点)
};
struct frz_rcd_t
{
struct rtc_time_t tm; // 定点时刻
u8 min_frz_num; // 十五分钟冻结信息体个数
u8 day_frz_num; // 日冻结信息体个数
struct frz_rcd_data min_data[SW_DD_NUM_ALL];
struct frz_rcd_data day_data[SW_DD_NUM_ALL];
};
/****************************功率反向电能量冻结值文件****************************/
#define FLOW_RCD_NUM 8
struct flowrev_rcd_data
{
u16 cp;
float elem_val; // 信息元素值(浮点)
struct rtc_time_t rev_time; // 冻结时刻
};
struct flowrev_rcd_t
{
u8 info_num;
struct rtc_time_t time_bk;
struct flowrev_rcd_data data[FLOW_RCD_NUM];
};
/************************************日志记录文件******************************/
enum
{
TYPE_LOG_NULL = 0,
TYPE_DEV_RESTART,
TYPE_CHNL_LINK,
TYPE_COMM_ERR,
TYPE_HW_ERR,
TYPE_SW_ERR,
TYPE_MAIN_POW,
TYPE_STANDBY_POW,
TYPE_CTL_LOOP,
TYPE_SW_YX,
TYPE_DEV_PARM,
TYPE_SW_UPDATE,
LOG_TYPE_NUM
};
#define LINK_CH_NUM 12
typedef struct LOG_FLAG
{
bool com_err[COMM_CHANNEL_NUM];
bool mdygd;
bool sdygd;
bool dchh;
bool dcyc;
} LOG_FLAG;
struct log_struct
{
u8 id;
u8 val;
struct rtc_time_t time;
char des_str[128];
};
#define LOG_NUM 16
struct log_poll
{
volatile u8 head;
volatile u8 tail;
struct log_struct log[LOG_NUM];
};
struct history_rcd_file
{
struct rtc_time_t create_time; // 文件创建时间
int node_num; // 节点数
int rcd_num;
u32 len; // 文件大小
char name[64]; // 文件名
struct file *handle;
int offset;
int num_pos;
};
struct rcd_file_info
{
u32 len; // 一条记录的长度
u32 rcd_num; // 记录行总数
u16 part_id; // 节点索引
u16 end_index;
u8 file_num; // 文件总数
bool b_err; // 错误标志
bool b_new;
};
extern struct rcd_file_info soe_file_info;
extern struct rcd_file_info yk_file_info;
extern struct rcd_file_info fixpt_file_info;
extern struct rcd_file_info exv_file_info;
extern struct rcd_file_info frz_file_info;
extern struct rcd_file_info log_file_info;
extern struct exv_rcd_t exv_rcd;
extern struct fixpt_rcd_t fixpt_rcd;
extern LOG_FLAG log_flag;
extern bool histrory_file_set;
extern bool b_hisfile_format;
extern bool hs_file_init_flag;
extern struct log_poll log_st;
extern bool b_iec_change;
extern struct history_rcd_file event_rcd_file[2]; // 事件记录,包括SOE及操作记录
extern fileInfo soeList; // SOE事件记录
extern fileInfo coList; // 遥控操作记录
extern fileInfo flowrevList; // 潮流反向记录
extern fileInfo logList; // 日志记录
extern char *p_his_file[];
extern const char *history_file_name[][2];
int acquire_exv_data(u8 day);
int create_event_rcd_file(u8 type);
int read_exv_rcd_file(u8 day);
int create_exv_rcd_file(struct rcd_file_info *p_info);
void get_exv_rcd_data(struct rtc_time_t time, bool day_change);
int read_fixpt_rcd_file(u8 day, u16 *p_part_id);
int read_frz_rcd_file(u8 day, u16 *p_part_id);
int read_flowrev_rcd_file(void);
int flowrev_rcd_file_deal(void);
int create_fixpt_rcd_file(void);
int create_frz_rcd_file(void);
int create_flowrev_rcd_file(void);
int exv_rcd_file_deal(struct rtc_time_t time);
int fixpt_rcd_file_deal(struct rtc_time_t time);
int frz_rcd_file_deal(struct rtc_time_t time);
int read_log_rcd_file(void);
void get_fixpt_rcd_data(struct rtc_time_t time_bk);
int get_frz_rcd_data(struct rtc_time_t time_bk);
void refresh_soe_file(EVENT_STRUCT *er);
void refresh_co_file(bool master, u8 frametype, u8 op_type, u16 cp, u8 cot, u8 cmd);
void init_hs_file(bool b_new_dir);
void refresh_exv_file(void);
void refresh_fixpt_file(void);
void hisory_file_app(void);
int create_log_rcd_file(void);
void load_hs_log_rcd(u8 id, bool rtc_flag, struct rtc_time_t *p_tm, char *buf, u8 val);
int get_flowrev_data(void);
void log_rcd_com_err_rst(int chnl);
bool log_file_app(void);
int hs_read_iec_crc(void);
bool hs_write_iec_crc(void);
int create_extreme_txt(u8 day);
int exv_txt_file_deal(void);
int init_his_db(void);
int init_his_soe_db(void);
int init_his_co_db(void);
int init_his_flowrev_db(void);
int init_his_log_db(void);
int del_history_file(u8 type);
int rt_file_deldir(char *pathname);
#endif