
#ifndef MQTT_NORTTH__
#define MQTT_NORTTH__


#include "mqtt_session.h"
#include "../tag.h"

// #define MAX_CLIENT_ID_LEN 256
#define MAX_BASE_LEN 256
#define MAX_BASE_SHORT_LEN 128
#define KEEP_ALIVE_MAX  10
#define DEFAULT_IPC_QOS 0

#define INTERNAL_BROKER_ADDR "localhost"
#define INTERNAL_BROKER_PORT 1883
#define INTERNAL_BROKER_USER ""
#define INTERNAL_BROKER_PASS ""

#define NORTH_MQTT_INFO_FILE "/app/config/bmser_ipc_bin.json"
#define MAX_MQTT_NORTH_DEV_NUM CHANNEL_DEVS_MAX
#define MAX_MQTT_NORTH_BLOCK_NUM CHANNEL_DEVS_MAX
#define MAX_MQTT_NORTH_SUB_NUM 512

typedef enum
{
    MQTT_TYPE_ERROR  =   -1,
    MQTT_TYPE_U16,
    MQTT_TYPE_S16,
    MQTT_TYPE_U32,
    MQTT_TYPE_S32,
    MQTT_TYPE_FLOAT,
    MQTT_TYPE_BI16,
    MQTT_TYPE_MAX
}MQTT_DATA_TYPE;

typedef struct mqtt_sub_info_t
{
    MQTT_DATA_TYPE data_type;
    tag_t *tag; //指向数采的tag
    char name[64];
    float scale;
}mqtt_sub_info_t;

#define SUB_INDEX_ADDR_OFFSET 1 //索引和地址的偏移

typedef struct mqtt_block_info_t
{
    int block_id;
    int cycle;
    int mqtt_sub_num;
    mqtt_sub_info_t *mqtt_sub_info[MAX_MQTT_NORTH_SUB_NUM];
    void *dev_info; //指向mqtt_dev_info_t
}mqtt_block_info_t;

typedef struct mqtt_dev_info_t
{
    char dev_id[MAX_BASE_SHORT_LEN],  
         module[MAX_BASE_SHORT_LEN], 
         type[MAX_BASE_SHORT_LEN];
    int mqtt_block_num;
    mqtt_block_info_t *mqtt_block_info[MAX_MQTT_NORTH_BLOCK_NUM];
}mqtt_dev_info_t;


typedef struct north_mqtt_var_s
{
    mqtt_session_t *session;
    char topic_sn[MAX_BASE_SHORT_LEN];
    pthread_t mqtt_cycle_tid;
    int mqtt_dev_num;
    mqtt_dev_info_t *mqtt_dev_info[MAX_MQTT_NORTH_DEV_NUM];
}north_mqtt_var_t;


typedef struct north_mqtt_param_s
{
    char addr[MAX_BASE_LEN],
        user[MAX_BASE_LEN],
        pass[MAX_BASE_LEN],
        client_id[MAX_BASE_LEN],
        topic_sn[MAX_BASE_LEN];
    int  port;
}north_mqtt_param;

typedef union 
{
    unsigned int v_ui;
    unsigned char v_c[4];
}UNION_UINT;

typedef union 
{
    unsigned short v_us;
    unsigned char v_c[2];
}UNION_USHORT;

typedef union 
{
    int v_i;
    unsigned char v_c[4];
}UNION_INT;

typedef union 
{
    short v_s;
    unsigned char v_c[2];
}UNION_SHORT;

typedef union 
{
    float v_f;
    unsigned char v_c[4];
}UNION_FLOAT;


typedef struct analsys_block_info_t
{
    UNION_UINT blockId;
    UNION_USHORT StartSubId,SubNum,Bytes;
    char *data_pr;
}analsys_block_info_t;

typedef struct analsys_dev_info_t
{
    unsigned char block_num;
    analsys_block_info_t block_info[32];
}analsys_dev_info_t;


typedef struct base_frame_head_t
{
    UNION_UINT TransId;
    unsigned char DevLen;
    unsigned char DevMes[MAX_BASE_SHORT_LEN];
    unsigned char CmdLen;
    unsigned char CMD[MAX_BASE_SHORT_LEN];
    UNION_USHORT PayloadLen;
}base_frame_head_t;

// typedef struct base_frame_t
// {
//     base_frame_head_t frame_head;
//     unsigned char DevLen;
// }base_frame_t;


north_mqtt_var_t *north_mqtt_client_init(north_mqtt_param *mqttparam);
void mqtt_north_start(north_mqtt_var_t *var);
#endif
