#ifndef __COMMON_SOCKET_H
#define __COMMON_SOCKET_H

#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_pp.h"
#include "dy_utils/dy_socket_session.h"
#include "dy_utils/dy_ipc.h"

#define TCP_CLIENT_NODE_STATUS_BAK_FILE "/app/supec5100_status.bak"

typedef struct _supec5100_var_s supec5100_var_t;

typedef struct _connect_config_s 
{
	struct list_head list;
	socket_session_t *socket_client;
	socket_type_e type;
	char *addr;
	int port;
	char sn[SN_MAX_LEN];
	char TestMethod[64];
	int opt_step;
	int end_collecting;
	time_t last_send;
	supec5100_var_t *var;
} connect_config_t;

typedef struct _general_cmd_s 
{
	int Time;
	char name[32];
	int cmd_len;
	char *cmd;
} general_cmd_t;

typedef struct _special_cmd_s 
{
	char cmd[256];
} special_cmd_t;

typedef struct _start_cleaning_s 
{
	int cmd_cnt;       // 命令数量
    general_cmd_t cmd[0]; //命令信息
} start_cleaning_t;

typedef struct _device_cleaning_s 
{
	start_cleaning_t *start_cleaning_A;
	start_cleaning_t *start_cleaning_B;
} device_cleaning_t;

typedef struct _self_checking_s 
{	
    general_cmd_t PumpStart; //命令信息
    general_cmd_t PumpStop; //命令信息
    general_cmd_t InjectionValve1A; //命令信息
    general_cmd_t InjectionValve1B; //命令信息
    general_cmd_t InjectionValve2A; //命令信息
    general_cmd_t InjectionValve2B; //命令信息
    general_cmd_t TemperatureControl1; //命令信息
    general_cmd_t TemperatureControl2; //命令信息
    general_cmd_t LightDetectorOpen; //命令信息
    general_cmd_t LightDetectorClose; //命令信息
} self_checking_t;

typedef struct _self_collecting_s 
{
	int cmd_cnt;       // 命令数量
    general_cmd_t cmd[0]; //命令信息
} start_collecting_t;

typedef struct _test_step_s 
{
	int cmd_cnt;       // 命令数量
    general_cmd_t cmd[0]; //命令信息
} test_step_t;

typedef struct _supec5100_node_config_s {
	char TestMethod[64];
	char DetectionTimes;//检测次数
	int T2;
	int PeekStartTime;
	int T1;
	char FitData[32];
	int AutoRevise;
	int PeekValley;
	int IntegralTime;
	int PeekIntervarTime;

	device_cleaning_t device_cleaning;
	char EndCleaning[64];
	self_checking_t self_checking;
	start_collecting_t *start_collecting;
	char EndCollecting[64];
	test_step_t *test_step;
} supec5100_node_config_t;

typedef struct _supec5100_config_s 
{
	int node_cnt;       // 节点数量
    supec5100_node_config_t node[0]; //节点数据，使用0元数组方便扩展
} supec5100_config_t;

typedef struct
{
    struct list_head list;
    pp_regulate_signal_t regulate_data;
    time_t last_send;
} supec5100_data_list_t;

typedef struct _supec5100_var_s
{
    ipc_session_t* session; //内部broker的MQTT session，用于进程间通信
    struct list_head connect_list;
	struct list_head data_list;
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    supec5100_config_t *supec5100_config;
    kv_array_t identifier_backup;
    dev_status_table_t *ds; //下挂节点的状态信息
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    char gprs_no[16];
    int mqtt_msg_timer;
	int node_cnt;
} supec5100_var_t;

#endif
