
#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))


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;

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*);


double get_meter_active_power(const char *dev_no);

void set_alarm_cnt(int alarmcnt);
void set_sample_period_by_run_state();
int get_mode();
void do_trip(void);
//
void require_cabinet_count(pcs_ctrl_var_t *var);
/***********************************************8*/
int load_lc_device_cfg(proto_forward_t *proto);
int lc_cfg_to_nod_sync(const char *cfg_file);
int lc_nod_to_cfg_sync(const char *cfg_file);
int check_ems_offline(void);
int get_lc_stop_discharge_tab(void);
int get_lc_stop_charge_tab(void);
#endif