#ifndef __PP_H
#define __PP_H

#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/dy_pp.h"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "lnxall_ubuslog.h"
#if _PP_USE_PYTHON3
  #include "python3.9/Python.h"
#else
  #include "python2.7/Python.h"
#endif


#define DTU_TT_UP 		0xBF //TT:TRANSPARENT_TRANSMISSION
#define DTU_TT_DOWN 	0x3F

#define DIR_PROTOCOL_SCRIPT			"/mnt/nfs/qixiangzhan_demo.py" // "/mnt/nfs/qixiangzhan_demo.lua"

#define FUN_PROTOCOL_ENCODE_NAME	"protocol_encode"
#define FUN_PROTOCOL_DECODE_NAME	"protocol_decode"
#define FUN_SCRIPT_ENTRY            "main_loop"

#define CRC_STRING			"crc"
#define CRC_PADDING			"crc_padding"
#define CRC_RAW_DATA_NAME	"raw_data"
#define START_ADDRESS       "start_address"



#define VAR2STR(var) #var

union pp_uint_float {
    unsigned int i_val;
    float        f_val;
};

#define TAG_TO_JSON(ptag, jtag, tagv) do {\
    if(ptag.k != 1 || ptag.b !=0)\
    {\
    	double tagD = (*tagv) * ptag.k + ptag.b;\
    	cJSON_AddNumberToObject(jtag,ptag.sign_mark,tagD);\
    }\
    else\
    {\
		cJSON_AddNumberToObject(jtag,ptag.sign_mark,*tagv);\
    }\
}while(0)

struct _pp_var_t;

typedef enum
{
    SCRIPT_DECODE,
    SCRIPT_ENCODE,
} script_type_e;


typedef struct _javascript_connect_t
{
	int fd;
	unsigned char   serverip[4];
	unsigned short  port;
	unsigned short  connected;
	int connect_timer;
	int retry_cnt;
	unsigned int  timeout;
}javascript_connect_t;

typedef struct 
{
	pp_real_time_data_t *rtData;
	unsigned char dtu;
	unsigned char flag;
} script_decode_data_t;

typedef struct 
{
	cJSON *data;
    pp_regulate_signal_t *rglt_data;
} script_encode_data_t;

typedef union
{
	script_decode_data_t data_decode;
	script_encode_data_t data_encode;
} script_data_t;

typedef struct pp_script_msg_node_s
{
	struct list_head list; // 消息列表
	node_cfg_t *node; // 设备节点
	script_type_e type; // 类型， encode， decode
	script_data_t data; // 数据
} pp_script_msg_node_t;

typedef struct pp_script_thread_s
{
	template_cfg_t *ptemplate; //模板信息
	struct _pp_var_t *var;
	pthread_mutex_t script_lock;
    pthread_cond_t script_cond;
	struct list_head data_list; // 消息列表
	int received; // 1 有消息待处理, 0: 无消息待处理
} pp_script_thread_t;

typedef struct _feed_info_s
{
	char *template_id;
	time_t last_feed;
} feed_info_t;

typedef struct _pp_var_t
{
    ipc_session_t* session; //内部broker的MQTT client，用于进程间通信
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    object_table_t *object_table; //物模型信息
	lua_State *lua;
	int python;
	javascript_connect_t javascript;
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
	int deamon_script_cnt;
	feed_info_t *feed_info;
	int poll_timer;
}pp_var_t;


extern int pp_parse_realtime_data(pp_var_t *var, ipc_msg_t *mqtt_msg);
extern int msg_set_regulate_signal_val(pp_var_t *var, ipc_msg_t *mqtt_msg);
extern lua_State *pre_load_scrite_lua(char *file_name);
extern int pp_parse_data_by_template(pp_var_t *var, template_cfg_t *ptemplate, node_cfg_t *node, pp_real_time_data_t *rtData, unsigned char flag, unsigned char dtu);
extern int pp_regulate_signal_processor(pp_var_t *var, template_cfg_t *ptemplate, cJSON *node, node_cfg_t *node_cfg, pp_regulate_signal_t *rglt_data);
extern int pp_send_data_to_script(pp_var_t *var, template_cfg_t *ptemplate, script_data_t *script_data, node_cfg_t *node, script_type_e type);
extern int pp_start_script_thread(pp_var_t *var, template_cfg_t *template);
extern int pre_load_script(template_cfg_t *template);

#endif
