
/*
* @fileName alarm_define.h
* @author gaoyang
* @date 2025-01-10 10:04
* @description 
*/
#ifndef _ALARM_DEFINE_H
#define _ALARM_DEFINE_H

#include "../tag.h"
#include <dy_utils/lnxall_buffer.h>


#define ALARM_INFO_FILE "/app/alarminfo/alarm_def.json"
#define ALARM_DISABLE_LIST_FILE "/app/config/emms2_alarm_disable_list.json"

#define DEV_TYPE_EMS         "EMS"
#define DEV_TYPE_LC          "LC"
#define DEV_TYPE_DIDO        "DIDO"
#define DEV_TYPE_PCS         "PCS"
#define DEV_TYPE_BMS         "BMS"
#define DEV_TYPE_METER       "METER"
#define DEV_TYPE_AC          "AC"
#define DEV_TYPE_OTHERS      "OTHERS"
#define DEV_TYPE_TMS         "TMS"
#define DEV_TYPE_PV          "PV"
#define DEV_TYPE_MPPT        "MPPT"
#define DEV_TYPE_HUMITURE    "HUMITURE"
#define DEV_MT_PCS           "PCS"
#define DEV_MT_GRID          "GRID"
#define DEV_TYPE_AIRECOND    "AIRCOND"
#define DEV_TYPE_LIQUID_COOL "LIQUID_COOL"
#define DEV_TYPE_UPS          "UPS"

#define DEV_DEFINE_ALARM_NUM 38

#define ALARM_CHILD_CONDS_NUM_MAX 16

#define MAX_ALARM_QUEUE_SIZE        1000
#define MAX_ALARM_REPORT_QUEUE_SIZE 1000

#define ALARM_RAISE    1
#define ALARM_RECOVERY 0

typedef enum
{
    CONDITION_ERROR = -1,
    CONDITION_GT, // 0大于 1大于等于 2等于 3小于 4小于等于
    CONDITION_GE,
    CONDITION_EQ,
    CONDITION_LT,
    CONDITION_LE,
    CONDITION_MAX
} ALARM_CONDITION;

// typedef enum
// {
//     EMMS2_TAG_TYPE_R = 0,
//     EMMS2_TAG_TYPE_RW,
//     EMMS2_TAG_TYPE_ALARM
// } EMMS2_TAG_TYPE;

typedef enum
{
    EMMS2_SEVERITY_CLEAR = -1,
    EMMS2_SEVERITY_WARNING,
    EMMS2_SEVERITY_MINOR,
    EMMS2_SEVERITY_MAJOR,
    EMMS2_SEVERITY_CRITICAL
} EMMS2_ALARM_SEVERITY;

typedef enum
{
    EMMS2_CATEGORY_COMMUNICATION,
    EMMS2_CATEGORY_CUTOMIZED,
    EMMS2_CATEGORY_EQUIPMENTS,
    EMMS2_CATEGORY_RESOURCES,
    EMMS2_CATEGORY_SERVICES,
} EMMS2_ALARM_CATEGORY;

typedef struct alarm_child_cond_t
{
    char*           tag_name;
    ALARM_CONDITION cond;
    int             value;
} alarm_child_cond_t;


typedef struct alarm_info_cond_t
{
    char*    tag_name;
    uint32_t alarm_code;                                  // 告警编码
    uint8_t  reason_code;                                 // 告警原因编码
    char*    additional_para[ALARM_CHILD_CONDS_NUM_MAX]; //附加信息参数
    ALARM_CONDITION    cond;
    int                value;
    alarm_child_cond_t child_conds[ALARM_CHILD_CONDS_NUM_MAX];
    bool update_cond;
} alarm_info_cond_t;

typedef struct
{
    char*             dev_type;
    alarm_info_cond_t tages[DEV_DEFINE_ALARM_NUM]; //通用点位
} alarm_define_t;

typedef struct alarm_condition_t
{
    ALARM_CONDITION condition;
    int             value;
    tag_t*          tag;
} alarm_condition_t;

typedef struct alarm_condition_list
{
    int               num;
    alarm_condition_t register_alarm_param_info[ALARM_CHILD_CONDS_NUM_MAX];
} alarm_condition_list;



typedef struct alarm_val_t
{
    void* tags[ALARM_CHILD_CONDS_NUM_MAX]; //追加值的tag 如果有特殊的不是tag的值 可以根据过滤addition做特殊处理 位位置是一一对应的
    uint8_t addtype[ALARM_CHILD_CONDS_NUM_MAX]; //追加tag的那个信息 默认 0 tag的值 1 displayname
    uint8_t spilit[ALARM_CHILD_CONDS_NUM_MAX];  //为1的话此条结束下一条需要分割上报
    int num;
} alarm_val_t;

typedef struct alarm_info_t
{
    uint32_t           alarm_code;                           // 告警编码
    uint8_t            reason_code;                          // 告警原因编码
    uint8_t            category;                             // 告警分类
    uint8_t            severity;                             // 告警级别
    char*              para_list;                            // 文件中携带的附加参数字符串"tag1;tag2;"
    alarm_val_t*       additional_para;                      // 告警附加参数
    alarm_condition_t* condition[ALARM_CHILD_CONDS_NUM_MAX]; //告警触发条件
    int                condition_num;
} alarm_info_t;
void destory_alarm_info(alarm_info_t* alarm_info);

// alarm_tag_t
typedef struct alarm_tag_t
{
    tag_t*        tag;
    alarm_info_t* alarm_info[ALARM_CHILD_CONDS_NUM_MAX];
    int           alarm_info_num;

    // mqtt禁止告警上报
} alarm_tag_t;

void destory_alarm_tag(alarm_tag_t* tag);

// 添加同一个tag绑定的多个告警
int alarm_tag_add_alarm_info(alarm_tag_t* tag, alarm_info_t* alarm_info);
// 添加告警的触发条件
int alarm_tag_add_condition(alarm_info_t* tag, alarm_condition_t* condition);

typedef struct alarm_real_t
{
    alarm_info_t* alarm;
    char*         entity;  //告警实体实例,
    char*         tagname;
    char*         additional; //附加参数, 需释放
    uint8_t       status;
    uint64_t      raise;
    uint64_t      recovery;
    list_head_t list;
} alarm_real_t;

typedef struct alarm_forbidden_t
{
    int alarm_code;
    list_head_t list;
} alarm_forbd_t;

void destory_alarm_real(alarm_real_t* alarm_real);

typedef struct alarm_real_t alarm_report_t; 
void destory_alarm_report(alarm_report_t* alarm_report);

struct alarm_history_buf
{
    int                num;
    struct lnxall_buff buff;
};

#define ALARM_CONDS_CB_NUM 100

typedef struct alarm_condition_chenge_event_t
{
    tag_t* tag;
    alarm_tag_t* alarm_tag_list[ALARM_CONDS_CB_NUM]; // 有哪些点位用到了这个条件
    int alarm_tag_num;
}cond_chenge_t; // 


//设备类型
extern alarm_define_t alarm_config_list[];
extern const int alarm_config_list_num;

#endif
