#ifndef __PUBLIC_H__
#define __PUBLIC_H__
#include "main.h"

#define ENG_ASS_POWER_EMS2PCS_SCALE 10
#define ENG_ASS_POWER_MAX 2000000
#define ABS_ITEM_NAME_NUMBERS 100
#define ENG_ASS_ACTION_TYPE_INIT -1

#define _init __attribute__((section(".data2.app"),used))
//#define MODULE_DECLARE(item) static const typeof(item) _struct_##item _init = item

extern abstract_item_t _data2_part_start[];
extern abstract_item_t _data2_part_end[];

#define ENG_ASS_ACTION_CHECK_MAX 5
#define ENG_ASS_ACTION_CHECK_LEVEL_MAX 3
#define ENG_ASS_REMOTE_MODE 1

typedef struct {
    energy_var_t *var;
    eng_ass_grp_t *grp;
}data_ctrl_thread_var_t;

typedef struct {
    char tag[TAG_LEN_MAX];
    uint32_t member_ofs;
    tag_type_e type;
}tag_info_t;

typedef enum 
{
    ENG_ASS_ASSIGN_MODE_AVERAGE,
} ENG_ASS_ASSIGN_MODE_E;

typedef enum 
{
    ENG_ASS_CONDITION_OK,
    ENG_ASS_CONDITION_SKIP,
    ENG_ASS_CONDITION_NO_MATCH,
} ENG_ASS_CONDITION_E;

typedef enum 
{
    ENG_ASS_MODE_TYPE_INIT=-1,
    ENG_ASS_MODE_TYPE_STOP,
    ENG_ASS_MODE_TYPE_STABY,
    ENG_ASS_MODE_TYPE_RUN,
} ENG_ASS_PCS_MODE_TYPE_E;

typedef struct {
    char *key;
    int value;
}eng_ass_tag_kv_t;

//条件状态机表格
typedef struct {
    char *desc;
    void (*update_cb)(energy_var_t *var,int grp, int value);
    int update_param;   
    int (*condition_cb)(energy_var_t *var,int grp, int value);
    int condition_param; 
    // handle_func_t send_msg_cb;
    // int send_msg_param;
}action_and_check_t;


int cond_wait_signal(eng_ass_grp_t *grp);
int data_ctrl_dev_action(energy_var_t *var,char *dev_sn,char *identifier,char *key,int val);
int data_ctrl_dev_action_muti_tag(energy_var_t *var,char *dev_sn,char *identifier,eng_ass_tag_kv_t *kv,int size);
int energy_services_load(energy_var_t *var,char *module);
int data_grp_get_assign_power(energy_var_t *var,int grp,int total_power);
#endif