
#ifndef __S7_PLC_COMMON_H
#define __S7_PLC_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_ds.h"
#include "dy_utils/kv_array.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/period_service.h"
#include "snap7.h"
/******************************************/

#define S7_PLC_NODE_STATUS_BAK_FILE "/app/s7_plc_status.bak"
/******************************************/

typedef struct _s7_plc_var_t s7_plc_var_t;

/*************ENUM*************************/
typedef enum
{
    S7_PLC_DATA_TYPE_CMD,        //实时命令
    S7_PLC_DATA_TYPE_PERIOD_CMD, //周期命令
    S7_PLC_DATA_TYPE_CMD_CNT,
} s7_plc_data_type_e;
/******************************************/

/*******************STRUCTURE**************/

typedef struct _plc_slot_client_s
{
    unsigned short term_addr;
    S7Object Client;
} s7_plc_slot_client_t;

typedef struct _plc_slot_s
{
    char *sn;
    int slot;
    S7Object Client;
} plc_slot_t;

typedef struct _plc_rack_s
{
    int rack;
    plc_slot_t *slot;
} plc_rack_t;

typedef struct _plc_client_s
{
    struct list_head list;
    char *ip_addr;
    int rack;
    int slot;
    S7Object Client;
} plc_client_t;

typedef struct
{
	struct list_head list;
	s7_plc_var_t *var;
	char sn[SN_MAX_LEN]; ///<设备SN
	plc_client_t *client;
} dev_node_t;

typedef struct _s7_plc_var_t
{
    ipc_session_t *session;            //内部broker的MQTT client，用于进程间通信
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table;   //模板信息
    period_service_t *period;
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    kv_array_t identifier_backup;
    dev_status_table_t *ds; //下挂节点的状态信息
    int node_status_timer;
    int period_poll_timer;
    time_t nodes_status_sync_date;
    bool period_triggered;
    bool need_send;
    bool upgrading;
	struct list_head connect_list;		// 连接
	struct list_head node_list;			// 节点
} s7_plc_var_t;

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

/******************FUNCTION****************/

#endif /* __S7_PLC_COMMON_H */
