
#ifndef DEVICE_LAYER_H_
#define DEVICE_LAYER_H_

#include "collector-api.h"
#include "../proto_forward.h"
#include "../adapter/pe_adapter.h"

#define NUM_OF_EMS_NODE_SIZE 100
#define NUM_OF_DEV_NODE_SIZE 100

#define MODBUS_SERVER_TAG_ADDR_MAP_FILE "/tmp/modbus_server_tag_addr.json"
#define MODBUS_SERVER_TAG_TEMPLATE_FILE "/tmp/modbus_server_template.json"
#define TRIGGER_CFG_FILE "/app/config/proto_trigger_cfg.json"
#define AUTOMATIC_CONFIG "automatic_control.json"

#define CHECK_STOP(d) (((d) > -1) && ((d) < 1))

#define EMS_MODE_DD 0 // 对等模式
#define EMS_MODE_ZC 1 // 主从模式


typedef enum tag_trigger_condition
{
    TAG_TRIGGER_EQ = 0,
    TAG_TRIGGER_GT,
    TAG_TRIGGER_LT,
    TAG_TRIGGER_GE,
    TAG_TRIGGER_LE,
    TAG_TRIGGER_MAX

} tag_trigger_condition;

typedef struct tag_trigger
{
    const char *sponsor;
    tag_trigger_condition condition;
    float cmp_value;
    const char *recipient;
    int self_restoring;
    uint32_t bit_mask;
} tag_trigger;

/**
 * typedef enum
{
    PROPERTY_REALDATA=0, 
    PROPERTY_SYSTEM,
    PROPERTY_ALARM,
    PROPERTY_MAX
}PROPERTY_TYPE;

*/
extern int ems_config_tab_count_g;
void dev_set_dev_tag_float(const char* dev_id, const char* var_id, double val);

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

int dev_get_dev_tag_int(const char* dev_id, const char* var_id);

double dev_get_dev_tag_float(const char* dev_id, const char* var_id);

int dev_get_nodeid_int(const char* nod_id);

int device_layer_init(void *parm);

int data_collect_init(void *parm,proto_forward_param_t *attr_p);

int variant_cb_register(pcs_ctrl_var_t *var);
int variant_cb_register_mul(pcs_ctrl_var_t *var);

int device_layer_selftest(void*);


int dev_get_dev_tag_float_with_result(const char *dev_id, const char *var_id, double *value);
int dev_get_dev_tag_int_with_result(const char* dev_id, const char* var_id,int *value);

double get_meter_active_power(const char *dev_no);

void set_alarm_cnt(int alarmcnt);
void set_hisalarm_cnt(int hisalarmcnt);
void set_sample_period_by_run_state();
int get_mode();
void set_point_desc();
void do_trip(void);
//
void require_cabinet_count(pcs_ctrl_var_t *var);
/*修改*/
void parameterSynchronizationIni();
/*END*/
int check_and_creat_vlc_template(void);
//
int check_master_ems_offline(void);
//
void check_voltage_time_std(void);
#endif
