#ifndef BMSER_TRANS_H
#define BMSER_TRANS_H

#include <stdint.h>
#include "version.h"
#include "bmser_port.h"

/* ******* MQTT公用的一些结构体、宏 ********/
enum MQTT_FUNC_T
{
    FUNC_WRITE_DB=1,
    FUNC_WRITE_DB_RESP,
    FUNC_READ_DB,
    FUNC_READ_DB_RESP,
    FUNC_ERROR_RESP,
    FUNC_FLOW_DOWNSTREAM,
    FUNC_FLOW_UPSTREAM,
};

#pragma pack(1)
struct DB_MQTT_MSG_S
{
    uint8_t     layer;
    uint8_t     devId;
    uint8_t     func;
    uint16_t    startAddr;
    uint16_t    regCnt;
    uint8_t     data[0];
};

struct BIN_MQTT_MSG_S
{
    uint8_t  func;
    //以下信息只有func为DB操作时有效
    uint8_t  layer;
    uint8_t  dev_id;
    uint16_t start_addr;
    //以下信息只有func等于6或者7时才有效
    uint8_t msgFlowBauId;
    uint8_t msgFlowBcuId;
    uint8_t msgFlowBmuId;
    uint8_t msgFlowWorkId;
    uint8_t msgFlowUpdateType;
    //实际数据起始字节
    uint8_t data[0];        // canrbus
};
#pragma pack()

#define DB_INFO_S       DB_MQTT_MSG_S
#define BIN_INFO_S      BIN_MQTT_MSG_S

#define GET_PAYLOAD_LEN_BY_DB_MQTT_LEN(len) \
    (len - sizeof(struct DB_INFO_S))

#define GET_PAYLOAD_LEN_BY_BIN_MQTT_LEN(len)    \
    (len - sizeof(struct BIN_INFO_S))

#define BROADCAST_BCUID         0x3f
#define BROADCAST_BCUID_FF    0xff //兼容三代总控上位机
#define BAUDATA_BCU_ID          0
#define POWER_ENV_BCU_ID        62

#define LINUX_RESERVE_DB_ADDR     0x07FF    // linux预留占用DB地址(bit0: EMS通信状态; bit1: PCS通信故障; bit2: UI内部故障)
#define UI_FAILT_BIT_INDEX             2    // UI内部故障bit位置

/*
    canrbus内定义的消息类型，在MQTT也有使用
*/
enum BMSER_TRANS_MSG_TYPE
{
    BMSER_TRANS_MSG_DB,     // DB读写类型
    BMSER_TRANS_MSG_BINARY, // 二进制消息流
    BMSER_TRANS_MSG_DB_READ, // DB读类型

    BMSER_TRANS_MSG_TYPE_MAX
};

/*消息转发，这个类型在mqtt侧是没有的，创建模板通道的时候也按照bin创建
所以没有放到enum BMSER_TRANS_MSG_TYPE里面去*/
#define BMSER_TRANS_MSG_FORWARDING  (BMSER_TRANS_MSG_BINARY + 1)

/******** 通道的一些通用结构 ********/

enum BMSER_DEV_TYPE
{
    BMSER_BAU,
    BMSER_BDU,
    // BMSER_BCU
};

#pragma pack(1)
struct BMSER_TRANS_MSG_S
{
    int type;
    union
    {
        struct DB_INFO_S dbInfo;
        struct BIN_INFO_S binaryInfo;
    }info;
    size_t  datalen;
    char data[0];       // 现在就是canrbus报文 / DB寄存器值
};
#pragma pack()

struct BMSER_TRANS_MGR
{
    enum BMSER_DEV_TYPE devType;
    int bduId;
    int minBcuId;     // 表示当前设备下，最小的bcuid。in bdu, maybe is > 0
};

enum BMSER_DEV_TYPE BMSER_TRANS_GetDevType();
struct BMSER_TRANS_MGR BMSER_TRANS_GetTransMgr();
void BMSER_TRANS_SetTransMgr(struct BMSER_TRANS_MGR mgr);

/********* 配置 **********/
#define MSG_RING_CAPACITY               (1024 * 10)
#define MAX_BCU_NUM_ON_BAU              61
#define MAX_TUNNELS_NUM                 1024
#define MAX_BCU_NUM_ON_BDU              MAX_BCU_NUM_ON_BAU
#define MAX_MSG_SIZE_IN_RING            (512 + sizeof(struct BMSER_TRANS_MSG_S))
#define MAX_CAN_CHANNEL_ID               2

#endif  // BMSER_TRANS_H

