#ifndef __CM_COMMON_H
#define __CM_COMMON_H

#include <string.h>
#include <syslog.h>
#include <time.h>
#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_pp.h"
#include "dy_utils/dy_db.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/bitmap.h"

#define BIT_RS485_RESTART      1
#define BIT_PP_RESTART         2
#define BIT_DR_RESTART         3
#define BIT_RULE_RESTART       4
#define BIT_LORA_RESTART       5
#define BIT_LORAWAN_RESTART    6
#define BIT_VDEV_RESTART       7
#define BIT_CAN_RESTART        8
#define BIT_HUAYUN_RESTART     9
#define BIT_LINKKIT_GATEWAY_RESTART     10
#define BIT_COMMON_SOCKET_RESTART     	11
#define BIT_NETWORK_RESTART     	12
#define BIT_IOT_CLD_RESTART     	13
#define BIT_CLOUD_MQTT_RESTART     	14
#define BIT_SHANGHAI_S5_RESTART     	15
#define BIT_VINT_RESTART       16
#define BIT_UPGRADE_RESTART    17
#define BIT_LANZHUO_RESTART     18
#define BIT_S7_PLC_RESTART     19
#define BIT_IPDEV_MANAGER_RESTART 20
#define BIT_BLE_RESTART 21
#define BIT_SCADA_IEC104_RESTART 22
#define BIT_RS485_SLAVE_RESTART  23
#define BIT_ENTRANCE_GUARD_RESTART 24
#define BIT_NETSNIFFER_RESTART 25

typedef struct
{
    int start_debug_info;
	int open;
} debug_info_t;

typedef struct _cm_var_s
{
    ipc_session_t* session; //内部broker的MQTT session，用于进程间通信
    template_table_t *template_table; //模板信息
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    int config_load_timer;
    bool gw_upgrading; //
    bits restart_flag; // bit map
    struct list_head reply_list;
    pthread_mutex_t restart_flag_lock;
	debug_info_t debug_info;
} cm_var_t;

typedef struct
{
    struct list_head list;
    int mi;
    char topic[TOPIC_MAX_LEN];
    int ret;
} reply_msg_t;


typedef  struct
{
    int mi;
    int tpte;
    int ip_type;
    char *pppoe_username;
    char *pppoe_password;
    char *ipaddr;
    char *netmask;
    char *gateway;
    char *dnss;
    char *dhcp;
    int dhcp_server_enable;
    int shcp_start;
    int dhcp_limit;
    int dhcp_leasetime;
    int bridge;
} lan_wan_cfg_t;

typedef enum
{
    TEST_OK = 0,
    SYSTEM_RUN_ERR = 10,
    NOT_WAN_PARAM_ERR,
    CMD_PARSER_ERR,
    BROKER_CONN_ERR,
} test_wan_code;

typedef struct
{
    const char * firmware_url;
    const char * firmware_md5;
    const char * upgraded; /* '1' if successfully upgrade, '0' if not */
} lnxall_firmware_t;

typedef struct
{
    char *ip;///<固定分派IP
    char *mac;///<
    char *id;///<
    char *name;///<
}net_mac_ip_t;

typedef struct
{
    uint32_t add_cnt;///<添加总数
    net_mac_ip_t **add_list;///<添加绑定
}net_mac_ips_t;

struct svr_restart_ops {
	unsigned int pre_delay;   ///< 执行服务重启命令前的sleep秒数
	unsigned int post_delay;  ///< 执行服务重启命令后的sleep秒数
	const char * init_path;   ///< 启动脚本的绝对路径，通常为 /etc/init.d/XXX
	int is_reload;            ///< 当`is_reload为零时，执行 /etc/init.d/XXX restart；否则会执行 /etc/init.d/XXX reload
};

/*
 * 重启某个服务，注意，init_path应当为 openwrt 系统的启动脚本路径
 * 返回值：
 * 负值: 执行出错；
 * 0: 启动脚本未找到，不能执行重启操作
 * 正值：启动脚本执行成功
 */
extern int svr_restart(const struct svr_restart_ops * res_ops);

extern int cm_handle_mqtt_data(cm_var_t *var, ipc_msg_t *mqtt_msg);

#endif
