#ifndef __EMS_CTRL_PROC_H__
#define __EMS_CTRL_PROC_H__

#include "my_public.h"
#include "stdbool.h"
#include "stdint.h"
#include "lnxall_list.h"
#include "lnxall_ubuslog.h"
#define E_CHARGE_GROUP_MAX 10
#define E_CB_FUNC_MAX 10

#define IDENTIFIER_LEN 48

#define E_SHUTDOWN_DELAY 60*60

#define FAN_OFF_DELAY 15*60

#define E_CHANGE_WARN 0X1
#define E_DISCHANGE_WARN 0X2

#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"

#define BOLD                 "\e[1m"
#define UNDERLINE            "\e[4m"
#define BLINK                "\e[5m"
#define REVERSE              "\e[7m"
#define HIDE                 "\e[8m"
#define CLEAR                "\e[2J"
#define CLRLINE              "\r\e[K"

typedef enum main_state_e{
    E_MAIN_STATE_INIT,
    E_MAIN_STATE_FAULT,
    E_MAIN_STATE_OFF,
    E_MAIN_STATE_IDLE,
    E_MAIN_STATE_CHANGE,
    E_MAIN_STATE_DISCHANGE,
    E_MAIN_STATE_ANY,
    E_MAIN_STATE_MAX,
} E_MAIN_STATE;

//温湿度调节
typedef enum
{
    E_DEHUMIDIFY_MANUAL, //// 手动调节
    E_DEHUMIDIFY_AUTO,   //// 自动控制
} E_DEHUMIDIFY_E;

#define stastring(i) (state_string[i])

typedef struct act_func_param
{
    void *p1;
    int n1;
}act_func_param_t;

typedef bool (*is_cond_t)(pcs_ctrl_var_t *var); 
typedef int (*act_func_t)(pcs_ctrl_var_t *var,act_func_param_t func_param); //0 success other failed
typedef int (*failed_cb_t)(pcs_ctrl_var_t *var); //0 success other failed
typedef ALARM_STATUS (*check_alarm_t)(pcs_ctrl_var_t *var); 

typedef struct check_alarm_list
{
    check_alarm_t alarm_function_list_t;
    char* alarm_info_string;
}CHECK_ALARM_LIST;


typedef struct _delay_list_t
{
    struct list_head list;
    act_func_param_t param;
    time_t tm;
    uint32_t delay;
    int status;
} delay_list_t;

typedef enum condition
{
    E_CONDITION_NONE,   //什么都不做
    E_CONDITION_OFF,
    E_CONDITION_ON,
    E_CONDITION_FALL,   // 下降跳变
    E_CONDITION_RISE,   //  上升触发
}E_CONDITION;

typedef struct _func_with_param_t
{
    act_func_t act_func;  //返回成功才会继续向下执行,否则failed_cb
    act_func_param_t act_func_param;
}func_with_param_t;

typedef struct io_state_action
{
    BYTE *p_data;    //变量的数据指针
    E_CONDITION condition;
    int32_t timeout;    //
    func_with_param_t funcs[E_CB_FUNC_MAX];
}io_state_action_t;

typedef struct main_state_action
{
    E_MAIN_STATE src;
    E_MAIN_STATE dest; //
    func_with_param_t funcs[E_CB_FUNC_MAX];
    // failed_cb_t failed_cb;  //NULL action 执行出错后调转到初始状态
}main_state_action_t;

typedef struct main_state_condition
{
    int src;
    int dest; 
    is_cond_t act_funcs[E_CB_FUNC_MAX];  //返回成功才会继续向下执行,否则failed_cb
}main_state_condition_t;

typedef enum timeline
{
    T_TIMELINE_INIT,
    T_TIMELINE_NO,
    T_TIMELINE_EXIST,
}E_TIMELINE;
	

void ems_gy2_process_main(pcs_ctrl_var_t *var);


bool is_charge(pcs_ctrl_var_t *var);
bool is_discharge(pcs_ctrl_var_t *var);
bool is_idle(pcs_ctrl_var_t *var);
bool is_pcs_fault(pcs_ctrl_var_t *var);
bool is_aux_fault(pcs_ctrl_var_t *var);
bool is_bms_fault(pcs_ctrl_var_t *var);

bool is_not_pcs_fault(pcs_ctrl_var_t *var);
bool is_not_aux_fault(pcs_ctrl_var_t *var);
bool is_not_bms_fault(pcs_ctrl_var_t *var);

bool is_connect(pcs_ctrl_var_t *var);
bool is_disconnect(pcs_ctrl_var_t *var);
bool is_off(pcs_ctrl_var_t *var);

int wrap_pcs_onoff(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_pcs_disconnect(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_pcs_connect(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_ems_mode_set(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_do_set(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_do_reset(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_do_out(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_ems_alarm(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_di_is_closure(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_di_is_open(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_timer_reset(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_timer_is_timeout(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_dehumidify_status(pcs_ctrl_var_t *var,act_func_param_t param);
int wrap_ups_shutdown(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_timer_is_timeout(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_meter_timeout(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_do_clr(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_do_delay_set(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_do_delay_clr(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_delay_poll(pcs_ctrl_var_t *var);

int wrap_pcs_power(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_pcs_zero_power(pcs_ctrl_var_t *var,act_func_param_t param);

int wrap_standby(pcs_ctrl_var_t *var,act_func_param_t param);

void pv_folow_p1(pcs_ctrl_var_t *var);


#endif
