/** 
* @file      fanuc_comm.h 
* @brief     description about fanuc
* @details  e.g. 485 port config, period polling
* @author   wangleilei@zjdyiot.com
* @date     2019.06.20
* @version  A001 
* @par Copyright (c):  
*       DYIOT
* @par History:          
*   version: draft\n 
*/  
#ifndef __FANUC_COMMON_H
#define __FANUC_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 "fwlib32.h"
/******************************************/

#define FANUC_APP_KEY "v0HfqZPyDwSTnX6B"
#define FANUC_NODE_STATUS_BAK_FILE "/app/fanuc_status.bak"
/******************************************/


/*************ENUM*************************/
typedef enum
{
	FANUC_DATA_TYPE_CMD,//实时命令
	FANUC_DATA_TYPE_PERIOD_CMD,//周期命令
	FANUC_DATA_TYPE_CMD_CNT,
}fanuc_data_type_e;
/******************************************/


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

typedef struct _fanuc_var_t
{    
    ipc_session_t* session; //内部broker的MQTT client，用于进程间通信
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
	int node_status_timer;
} fanuc_var_t;

typedef struct _fanuc_thread_t
{
	unsigned char 	start_flag;
	unsigned char 	period_flag;

	struct list_head data_list[FANUC_DATA_TYPE_CMD_CNT];
	struct list_head tcp_node_list;
	pp_regulate_signal_t cmd_info;
   
    int send_timer;
    
    ipc_session_t* session; //内部broker的MQTT client，用于进程间通信
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    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;
    time_t nodes_status_sync_date;
    bool period_triggered;
    bool need_send;

	node_cfg_t *node;
	fanuc_var_t *var;
} fanuc_thread_t;



typedef struct
{
    struct list_head list;
	pp_regulate_signal_t rs;
	long long last_send;
}fanuc_data_list_t;

typedef struct
{
	fanuc_var_t *var;
	fanuc_data_list_t *data;
}fanuc_var_data_t;

typedef struct
{
    struct list_head list;
	struct list_head data_list;

	unsigned short flibHndl;

	//modbus_t *ctx;
	char tcp_ip_addr[SN_MAX_LEN]; ///<modbus TCP IP
    int  tcp_port;				  ///<modbus TCP PORT
    uint64_t send_cnt;
	uint64_t recv_cnt;
}tcp_node_list_t;

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


/******************FUNCTION****************/
extern int fanuc_start_thread(fanuc_var_t *var, node_cfg_t *node);

#endif /* __fanuc_COMMON_H */
