/*
 * @Author: zhy
 * @Date: 2022-09-09 18:25:41
 * @LastEditors: qianziyang qianzy@bmser.com
 * @LastEditTime: 2023-11-17 10:08:08
 * @Description:
 */
#ifndef __EXCHANGE_WITH_MQTT_H__
#define __EXCHANGE_WITH_MQTT_H__
#include "platmacro.h"
#include "update_suport.h"

typedef void (*exchange_with_mqtt_stop_upgrade)();

typedef void (*exchange_with_mqtt_start_upgrade)(OTA_Exchange_Stru *data);

typedef void (*exchange_with_mqtt_show_version)(OTA_Exchange_Stru *data);

typedef int32_t (*exchange_with_mqtt_dev_reset)(OTA_Exchange_Stru *data);

typedef int32_t (*exchange_with_mqtt_callback)(uint8_t* buf, uint32_t len, void* param, bool *isUpgrading);

#pragma pack(1)

typedef struct
{
    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_xncan_header_t;

typedef struct
{
    exchange_with_mqtt_callback         message_callback;
    exchange_with_mqtt_start_upgrade    start_upgrade;
    exchange_with_mqtt_stop_upgrade     stop_upgrade;
    exchange_with_mqtt_show_version     show_version;
    exchange_with_mqtt_dev_reset        dev_reset;
} exchange_with_mqtt_callback_s;


#pragma pack()

/**
 * @description: 通过mqtt消息发送CAN包 
 * @param {uint8_t*} buf 消息内容
 * @param {uint32_t} len 消息长度
 * @param {void*} param
 * @return {*}
 */
void exchange_with_mqtt_send_package(uint8_t* buf, uint32_t len, void* param);

/**
 * @description: 通过MQTT消息上报升级状态
 * @param {char *} status 升级状态
 * @param {uint32_t} status_len 升级状态长度
 * @param {int} percent 升级百分百
 * @return {*}
 */
void exchange_with_mqtt_send_upgrade_status(const char * status, uint32_t status_len, int percent);

/**
 * @description: exchange_with_mqtt_init
 * @param {exchange_with_mqtt_callback_s} *cbs 回调函数
 * @param {void *} param
 * @return {*} 0:success, others:fail.
 */
int exchange_with_mqtt_init(exchange_with_mqtt_callback_s *cbs, void * param);

#endif  //__EXCHANGE_WITH_MQTT_H__
