#ifndef AUTOMATIC_H__
#define AUTOMATIC_H__
#include "../tag.h"

/*****************************/

typedef enum
{
    AUTOMATIC_CONDITION_ERROR = -1,
    AUTOMATIC_CONDITION_GT, // 0大于 1大于等于 2等于 3小于 4小于等于 
    AUTOMATIC_CONDITION_GE,
    AUTOMATIC_CONDITION_EQ,
    AUTOMATIC_CONDITION_LT,
    AUTOMATIC_CONDITION_LE,
    AUTOMATIC_CONDITION_MAX
}AUTOMATIC_CONDITION;
typedef enum
{
    AUTOMATIC_MODE_DEFAULT=0, //默认 触发执行，触发哪个执行哪个
    AUTOMATIC_MODE_STOP,   // 执行后不再执行其他条件 需要重启
    AUTOMATIC_MODE_FOLLOW, //跟随模式  按照value/100的倍率跟随
    AUTOMATIC_MODE_REPEAT, //重复 每次成立都会按DEFAULT触发
}AUTOMATIC_MODE;

typedef struct
{
    char *name;
    tag_t *tag; //触发的tag
    AUTOMATIC_CONDITION condition; 
    int value;
    char *value_tag_name;
    tag_t *value_is_tag; //value是点位
    int debounceTime;    //消抖
    int debounceCount;
    void *up_pr;//指向上一级的指针
}CONDITION_AND_INFO;

typedef struct
{
    AUTOMATIC_MODE mode;  
    bool striggered; //是否触发过  AUTOMATIC_MODE_STOP模式的触发过将不会再触发其他值
    int conditionAnd_index;
    int condition_and_alloc;
    CONDITION_AND_INFO **condition_and_info;
}CONDITION_OR_INFO;
typedef struct
{
    int conditionList_index;
    int condition_list_alloc;
    CONDITION_OR_INFO **condition_or_info;
    int actVal; //触发值
}CONDITION_INFO;
typedef struct
{
    char *name; //执行的tag名称，如果tag不存在可能需要用这个名称调用 对应的一些方式
    int reset;
    int restValue;
    tag_t *tag; //执行的tag
    int condition_index;
    int condition_info_alloc;
    bool delaystriggered;
    CONDITION_INFO **conditionInfo;
}AUTOMATIC_INFO;

/**********创建一些组件去执行非点位的特殊动作*********/

typedef enum 
{
    MODEL_TYPE_STRIP = 0,//脱扣  
}MODEL_TYPE;

typedef struct 
{
    
}AUTOMATIC_MODEL;//组件



AUTOMATIC_INFO * automatic_init(const char *cfg_f);
void automatic_deinit(void);
void clean_stop_state();
void do_automatic_delay_work(void);
#endif
