#ifndef __PUB_FUN_H__
#define __PUB_FUN_H__
#include "../common.h"
#include "open62541.h"
#include "../opcua/ua-server.h"
//
#define IS_CHARGE(p) ((p) < -0.001)
#define IS_DISCHARGE(p) ((p) > 0.001)
#define IS_IDLE(p) (((p) >= -0.001) && ((p) < 0.001))
#define IS_CLOSE(p) (((p) >= -0.2) && ((p) < 0.2))

typedef struct
{
    char **protocol;
    char* vendor;
    char *model;
    char *version;
    char *type;
} template_info_t;

typedef enum ems_point_type
{
    EMS_POINT_INT,
    EMS_POINT_FLOAT
} EMS_PIONT_TYPE;

typedef struct
{
    char *dev;
    char *variant;
    char *name;
    int flag;       // 读写权限
    int data_type;  // 数值类型
    int point_type; // 点位类型 使用PROPERTY_TYPE的定义
    char *history_type;
#ifdef EN_LC
    int is_cfg; // 非0需要写入配置文件
#endif
    char *desc; // 枚举描述
#ifdef EN_EMS
    unsigned char fun_code; // 北向mudbus采集功能码
    unsigned short addr;    // 北向mudbus采集地址
    DATA_TYPE type;         // 北向mudbus采集数据类型
    DATA_ORDER order;       // 北向mudbus采集字节序和大小
    float coefficient;      //
#endif
    int min;
    int max;
} ems_base_variant_t;

//
typedef struct
{
    UA_NodeId aboutNodeId;

    UA_NodeId iccidNodeId;
    UA_NodeId InternaliccidNodeId;
    UA_NodeId ExternaliccidNodeId;
    UA_NodeId simLocNodeId;
    UA_NodeId siteNameNodeId;
    UA_NodeId cabNumNodeId;
    UA_NodeId cabPowerNodeId;
    UA_NodeId localNetEmsSuMNodeId;
    UA_NodeId versionNodeId;
    UA_NodeId gwSnNodeId;
    UA_NodeId productNodeId;
    UA_NodeId modelNodeId;
    UA_NodeId operationNodeId;
    UA_NodeId runDaysMNodeId;
} ABOUT_INFO;

typedef struct
{
    UA_NodeId upgradeNodeId;

    UA_NodeId uploadFileNodeId;
} UPGRADE_INFO;

typedef struct
{
    UA_NodeId expertNodeId;

    UA_NodeId changeDevNodeId;
    UA_NodeId timingNodeId;
    UA_NodeId getDevNodeId;
} EXPERT_INFO;

typedef struct
{
    UA_NodeId stateNodeId;

    UA_NodeId CPUNodeId;
    UA_NodeId memNodeId;
    UA_NodeId diskNodeId;
    UA_NodeId ExdiskNodeId;
    UA_NodeId NetStaNodeId;
    UA_NodeId EsmConnectNodeId;
    UA_NodeId EmsHeartbeatNodeId;
    UA_NodeId SignalLevel4GId;
} STATE_INFO;

typedef struct
{
    UA_NodeId debugNodeId;

    UA_NodeId emsLogLevelNodeId;
    UA_NodeId protoLogLevelNodeId;
} DEBUG_INFO;

typedef struct
{
    UA_NodeId systemNodeId;

    ABOUT_INFO aboutInfo;
    // UPGRADE_INFO upgradeInfo;
    EXPERT_INFO expertInfo;
    STATE_INFO stateInfo;
    DEBUG_INFO debugInfo;
} SYSTEM_INFO;

typedef struct _CPU_PACKED
{
    char name[16];
    unsigned int user;   // 用户模式
    unsigned int nice;   // 低优先级的用户模式
    unsigned int system; // 内核模式
    unsigned int idle;   // 空闲处理器时间
} CPU_OCCUPY;
int dev_cfg_merge(cJSON *dev_cfg1, cJSON *dev_cfg2, int need_cell);
char *create_ems_template(template_info_t *info_p, ems_base_variant_t **tags, int tags_size);
int get_nod_index(const char *nod, const char *head);
uint32_t get_all_fault_value(int rack_sum);
int read_sim_cb(char *name, void *value_v);
int read_sim_In(char *name, void *value_v);
int read_sim_Ex(char *name, void *value_v);
void *get_cycle_info(void *data);
void get_disk_usage(const char *path, double *mem_used_persent, unsigned long long *mem_used, unsigned long long *mem_totle);
int addMethodToNode(UA_SERVER_PARAM *_var, UA_NodeId parent_noteid, int argInNum, char *argsNameIn[], int argOutNum, char *argsNameOut[], char *functionId, char *functionName, ua_cb method);
int nod_cmp_int(const char *dev_id, const char *var_id, int cmp);
char *cal_file_md5(const char *f_name);
int cal_md5(char *str, char *out);
void *trip_task(void *args);
#if (SUPPORT_LED == 1)
void net_led_check();
#else
#define net_led_check(led)
#endif
int Ping_Test_IP(char *testip,int timeout_s);
int set_dido_common_config(cJSON* root);
void do_trip(void); // 脱扣

extern void dev_set_dev_tag_int(const char *dev_id, const char *var_id, int val);
extern int dev_get_dev_tag_int(const char *dev_id, const char *var_id);

// 热管理

#define DEFAULT_TEMP 666.0f
#define TMS_SET_MODE_FUNCTION "set_mode"
#define TMS_SET_HEAT_FUNCTION "set_heat"
#define TMS_SET_COOL_FUNCTION "set_cool"
#define AC_SET_ONOFF_FUNCTION "set_onoff"

typedef enum
{
    AC_STOP  = 0,
    AC_START = 1,
} AC_MODE;

typedef enum
{
    TMS_STANDBY = 0,
    TMS_COOL    = 1,
    TMS_HEAT    = 2,
    TMS_CYCLE   = 3,
    TMS_AUTO    = 4
} TMS_MODE; // 绑定类型

struct MODE_MAP
{
    char *no;
    char *tag;
    int value;
};
struct ACModeMap;

int heat_management_main(int ems_en_lc);

int ac_set_mode_api(AC_MODE mode);
int tms_set_temp_api(TMS_MODE mode, int value, const char *dev_no);
int tms_set_mode_api(TMS_MODE mode, const char *dev_no);

void check_aircond_startstop(float powernow);
void check_lc_update_aircond_startstop(float power);

int fan_ctrl(const char *ems_no_or_lc_no);//风机管理

void set_total_pcs_power_factor(float factor);
void set_total_pcs_fault_reset(int reset);
void set_total_pcs_repower_comp(int enable);
void set_total_bms_connect(int connect);
const char *get_disk_path(void);
int port_cfg_2_dio_template(cJSON *port_cfg, const char *save_name);
int check_and_update_emsd_version(const char *json_path);

typedef struct {
    char domain[128];
    uint16_t port;
    int status; // 0: 正常, 1: 不正常
} domain_info_t;

typedef struct {
    domain_info_t *list;
    int count;
} domain_list_t;

int sync_north_cfg_domain(domain_list_t *domain_list, const char *north_cfg_path);
int update_sys_cfg_domain(const domain_list_t *domain_list,const char *sys_cfg_path);
int check_domain_connectivity(const domain_list_t *domain_list);
int get_en_lc_to_lc_list(char *json_path);

void get_cpu_usage(double *cpu_used);
const char *ems_get_cached_product_model(void);
int clean_4g_cfg_ipw(char *mode4gcfgpath);
#endif
