Răsfoiți Sursa

添加尚飞智能电池信息

jujihjuji 4 zile în urmă
părinte
comite
c28579083e
4 a modificat fișierele cu 517 adăugiri și 1 ștergeri
  1. 13 0
      msg_definitions/VKFly.xml
  2. 19 0
      readme.md
  3. 1 1
      v2.0/VKFly/VKFly.h
  4. 484 0
      v2.0/VKFly/mavlink_msg_shangfei_bms.h

+ 13 - 0
msg_definitions/VKFly.xml

@@ -1295,6 +1295,19 @@
     </message>
 
 
+    <message id="53310" name="SHANGFEI_BMS">
+    <description>VKFLY transfer update terminate. Send this message to terminate a update file
+        transfer.</description>
+       <field type="uint32_t" name="time_boot_ms" units="ms">Timestamp in ms from system boot.</field>
+       <field type="uint16_t" name="bat_voltage" units="dV">Battery voltage.</field>
+       <field type="int16_t" name="bat_current" units="dA">Battery current.</field>
+       <field type="int8_t" name="bat_maxtemp" unit="degC">Battery Max_temperature.</field>
+       <field type="uint8_t" name="cap_percent" units="%">Battery capacity.</field>
+       <field type="uint8_t" name="bat_id">Battery id.</field>
+       <field type="uint8_t" name="err_code">Error code.</field>
+       <field type="uint16_t" name="hvb_voltage" units="dV">High volt-box voltage.</field>
+       <field type="int8_t" name="hvb_temp" unit="degC">High volt-box temperature.</field>
+    </message>
   </messages>
 
 </mavlink>

+ 19 - 0
readme.md

@@ -738,6 +738,25 @@ M5~M8\M13~M16为固定翼舵面舵机.
 | cyc_cnt      | 循环次数                     |
 | heath        | 电池健康度 1%                |
 
+### 2.19.1 尚飞智能电池BMS信息 SHANGFEI_BMS_STATUS
+
+尚飞智能电池状态数据
+当检测到智能电池数据接入, 飞控自动周期向地面站发送此消息
+
+| 字段         | 说明                         |
+| ------------ | ---------------------------- |
+| time_boot_ms | 系统本地时间戳ms             |
+| bat_voltage  | 电压 dV(0.1V)                |
+| bat_current  | 电流 dA(0.1A), 负数表示充电 |
+| bat_maxtemp  | 电池最大温度 1度              |
+| cap_percent  | 电量 1%                      |
+| bat_id       | 电池编号, 总共2个电池,编号1-2 |
+| err_code     | 电池包故障码, 0为无故障        |
+| hvb_volt     | 电压盒电压 0.1V               |
+| hvb_temp     | 电压盒温度 1度               |
+
+
+
 ### 2.20 发动机ECU数据 VK_ENGINE_ECU_STAUS 和转速 RAW_RPM
 
 发动机 ecu 状态信息

+ 1 - 1
v2.0/VKFly/VKFly.h

@@ -805,7 +805,7 @@ typedef enum MAV_CMD
 #include "./mavlink_msg_vk_cacc_manager_verify.h"
 #include "./mavlink_msg_fmub_status.h"
 #include "./mavlink_msg_qingxie_bms.h"
-
+#include "./mavlink_msg_shangfei_bms.h"
 // base include
 #include "../common/common.h"
 

+ 484 - 0
v2.0/VKFly/mavlink_msg_shangfei_bms.h

@@ -0,0 +1,484 @@
+#pragma once
+// MESSAGE SHANGFEI_BMS PACKING
+
+#define MAVLINK_MSG_ID_SHANGFEI_BMS 53310
+
+
+typedef struct __mavlink_shangfei_bms_t {
+ uint32_t time_boot_ms; /*< [ms] Timestamp in ms from system boot.*/
+ uint16_t bat_voltage; /*< [dV] Battery voltage.*/
+ int16_t bat_current; /*< [dA] Battery current.*/
+ uint16_t hvb_voltage; /*< [dV] High volt-box voltage.*/
+ int8_t bat_maxtemp; /*<  Battery Max_temperature.*/
+ uint8_t cap_percent; /*< [%] Battery capacity.*/
+ uint8_t bat_id; /*<  Battery id.*/
+ uint8_t err_code; /*<  Error code.*/
+ int8_t hvb_temp; /*<  High volt-box temperature.*/
+} mavlink_shangfei_bms_t;
+
+#define MAVLINK_MSG_ID_SHANGFEI_BMS_LEN 15
+#define MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN 15
+#define MAVLINK_MSG_ID_53310_LEN 15
+#define MAVLINK_MSG_ID_53310_MIN_LEN 15
+
+#define MAVLINK_MSG_ID_SHANGFEI_BMS_CRC 63
+#define MAVLINK_MSG_ID_53310_CRC 63
+
+
+
+#if MAVLINK_COMMAND_24BIT
+#define MAVLINK_MESSAGE_INFO_SHANGFEI_BMS { \
+    53310, \
+    "SHANGFEI_BMS", \
+    9, \
+    {  { "time_boot_ms", NULL, MAVLINK_TYPE_UINT32_T, 0, 0, offsetof(mavlink_shangfei_bms_t, time_boot_ms) }, \
+         { "bat_voltage", NULL, MAVLINK_TYPE_UINT16_T, 0, 4, offsetof(mavlink_shangfei_bms_t, bat_voltage) }, \
+         { "bat_current", NULL, MAVLINK_TYPE_INT16_T, 0, 6, offsetof(mavlink_shangfei_bms_t, bat_current) }, \
+         { "bat_maxtemp", NULL, MAVLINK_TYPE_INT8_T, 0, 10, offsetof(mavlink_shangfei_bms_t, bat_maxtemp) }, \
+         { "cap_percent", NULL, MAVLINK_TYPE_UINT8_T, 0, 11, offsetof(mavlink_shangfei_bms_t, cap_percent) }, \
+         { "bat_id", NULL, MAVLINK_TYPE_UINT8_T, 0, 12, offsetof(mavlink_shangfei_bms_t, bat_id) }, \
+         { "err_code", NULL, MAVLINK_TYPE_UINT8_T, 0, 13, offsetof(mavlink_shangfei_bms_t, err_code) }, \
+         { "hvb_voltage", NULL, MAVLINK_TYPE_UINT16_T, 0, 8, offsetof(mavlink_shangfei_bms_t, hvb_voltage) }, \
+         { "hvb_temp", NULL, MAVLINK_TYPE_INT8_T, 0, 14, offsetof(mavlink_shangfei_bms_t, hvb_temp) }, \
+         } \
+}
+#else
+#define MAVLINK_MESSAGE_INFO_SHANGFEI_BMS { \
+    "SHANGFEI_BMS", \
+    9, \
+    {  { "time_boot_ms", NULL, MAVLINK_TYPE_UINT32_T, 0, 0, offsetof(mavlink_shangfei_bms_t, time_boot_ms) }, \
+         { "bat_voltage", NULL, MAVLINK_TYPE_UINT16_T, 0, 4, offsetof(mavlink_shangfei_bms_t, bat_voltage) }, \
+         { "bat_current", NULL, MAVLINK_TYPE_INT16_T, 0, 6, offsetof(mavlink_shangfei_bms_t, bat_current) }, \
+         { "bat_maxtemp", NULL, MAVLINK_TYPE_INT8_T, 0, 10, offsetof(mavlink_shangfei_bms_t, bat_maxtemp) }, \
+         { "cap_percent", NULL, MAVLINK_TYPE_UINT8_T, 0, 11, offsetof(mavlink_shangfei_bms_t, cap_percent) }, \
+         { "bat_id", NULL, MAVLINK_TYPE_UINT8_T, 0, 12, offsetof(mavlink_shangfei_bms_t, bat_id) }, \
+         { "err_code", NULL, MAVLINK_TYPE_UINT8_T, 0, 13, offsetof(mavlink_shangfei_bms_t, err_code) }, \
+         { "hvb_voltage", NULL, MAVLINK_TYPE_UINT16_T, 0, 8, offsetof(mavlink_shangfei_bms_t, hvb_voltage) }, \
+         { "hvb_temp", NULL, MAVLINK_TYPE_INT8_T, 0, 14, offsetof(mavlink_shangfei_bms_t, hvb_temp) }, \
+         } \
+}
+#endif
+
+/**
+ * @brief Pack a shangfei_bms message
+ * @param system_id ID of this system
+ * @param component_id ID of this component (e.g. 200 for IMU)
+ * @param msg The MAVLink message to compress the data into
+ *
+ * @param time_boot_ms [ms] Timestamp in ms from system boot.
+ * @param bat_voltage [dV] Battery voltage.
+ * @param bat_current [dA] Battery current.
+ * @param bat_maxtemp  Battery Max_temperature.
+ * @param cap_percent [%] Battery capacity.
+ * @param bat_id  Battery id.
+ * @param err_code  Error code.
+ * @param hvb_voltage [dV] High volt-box voltage.
+ * @param hvb_temp  High volt-box temperature.
+ * @return length of the message in bytes (excluding serial stream start sign)
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg,
+                               uint32_t time_boot_ms, uint16_t bat_voltage, int16_t bat_current, int8_t bat_maxtemp, uint8_t cap_percent, uint8_t bat_id, uint8_t err_code, uint16_t hvb_voltage, int8_t hvb_temp)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    char buf[MAVLINK_MSG_ID_SHANGFEI_BMS_LEN];
+    _mav_put_uint32_t(buf, 0, time_boot_ms);
+    _mav_put_uint16_t(buf, 4, bat_voltage);
+    _mav_put_int16_t(buf, 6, bat_current);
+    _mav_put_uint16_t(buf, 8, hvb_voltage);
+    _mav_put_int8_t(buf, 10, bat_maxtemp);
+    _mav_put_uint8_t(buf, 11, cap_percent);
+    _mav_put_uint8_t(buf, 12, bat_id);
+    _mav_put_uint8_t(buf, 13, err_code);
+    _mav_put_int8_t(buf, 14, hvb_temp);
+
+        memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#else
+    mavlink_shangfei_bms_t packet;
+    packet.time_boot_ms = time_boot_ms;
+    packet.bat_voltage = bat_voltage;
+    packet.bat_current = bat_current;
+    packet.hvb_voltage = hvb_voltage;
+    packet.bat_maxtemp = bat_maxtemp;
+    packet.cap_percent = cap_percent;
+    packet.bat_id = bat_id;
+    packet.err_code = err_code;
+    packet.hvb_temp = hvb_temp;
+
+        memcpy(_MAV_PAYLOAD_NON_CONST(msg), &packet, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#endif
+
+    msg->msgid = MAVLINK_MSG_ID_SHANGFEI_BMS;
+    return mavlink_finalize_message(msg, system_id, component_id, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+}
+
+/**
+ * @brief Pack a shangfei_bms message
+ * @param system_id ID of this system
+ * @param component_id ID of this component (e.g. 200 for IMU)
+ * @param status MAVLink status structure
+ * @param msg The MAVLink message to compress the data into
+ *
+ * @param time_boot_ms [ms] Timestamp in ms from system boot.
+ * @param bat_voltage [dV] Battery voltage.
+ * @param bat_current [dA] Battery current.
+ * @param bat_maxtemp  Battery Max_temperature.
+ * @param cap_percent [%] Battery capacity.
+ * @param bat_id  Battery id.
+ * @param err_code  Error code.
+ * @param hvb_voltage [dV] High volt-box voltage.
+ * @param hvb_temp  High volt-box temperature.
+ * @return length of the message in bytes (excluding serial stream start sign)
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_pack_status(uint8_t system_id, uint8_t component_id, mavlink_status_t *_status, mavlink_message_t* msg,
+                               uint32_t time_boot_ms, uint16_t bat_voltage, int16_t bat_current, int8_t bat_maxtemp, uint8_t cap_percent, uint8_t bat_id, uint8_t err_code, uint16_t hvb_voltage, int8_t hvb_temp)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    char buf[MAVLINK_MSG_ID_SHANGFEI_BMS_LEN];
+    _mav_put_uint32_t(buf, 0, time_boot_ms);
+    _mav_put_uint16_t(buf, 4, bat_voltage);
+    _mav_put_int16_t(buf, 6, bat_current);
+    _mav_put_uint16_t(buf, 8, hvb_voltage);
+    _mav_put_int8_t(buf, 10, bat_maxtemp);
+    _mav_put_uint8_t(buf, 11, cap_percent);
+    _mav_put_uint8_t(buf, 12, bat_id);
+    _mav_put_uint8_t(buf, 13, err_code);
+    _mav_put_int8_t(buf, 14, hvb_temp);
+
+        memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#else
+    mavlink_shangfei_bms_t packet;
+    packet.time_boot_ms = time_boot_ms;
+    packet.bat_voltage = bat_voltage;
+    packet.bat_current = bat_current;
+    packet.hvb_voltage = hvb_voltage;
+    packet.bat_maxtemp = bat_maxtemp;
+    packet.cap_percent = cap_percent;
+    packet.bat_id = bat_id;
+    packet.err_code = err_code;
+    packet.hvb_temp = hvb_temp;
+
+        memcpy(_MAV_PAYLOAD_NON_CONST(msg), &packet, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#endif
+
+    msg->msgid = MAVLINK_MSG_ID_SHANGFEI_BMS;
+#if MAVLINK_CRC_EXTRA
+    return mavlink_finalize_message_buffer(msg, system_id, component_id, _status, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+#else
+    return mavlink_finalize_message_buffer(msg, system_id, component_id, _status, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#endif
+}
+
+/**
+ * @brief Pack a shangfei_bms message on a channel
+ * @param system_id ID of this system
+ * @param component_id ID of this component (e.g. 200 for IMU)
+ * @param chan The MAVLink channel this message will be sent over
+ * @param msg The MAVLink message to compress the data into
+ * @param time_boot_ms [ms] Timestamp in ms from system boot.
+ * @param bat_voltage [dV] Battery voltage.
+ * @param bat_current [dA] Battery current.
+ * @param bat_maxtemp  Battery Max_temperature.
+ * @param cap_percent [%] Battery capacity.
+ * @param bat_id  Battery id.
+ * @param err_code  Error code.
+ * @param hvb_voltage [dV] High volt-box voltage.
+ * @param hvb_temp  High volt-box temperature.
+ * @return length of the message in bytes (excluding serial stream start sign)
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan,
+                               mavlink_message_t* msg,
+                                   uint32_t time_boot_ms,uint16_t bat_voltage,int16_t bat_current,int8_t bat_maxtemp,uint8_t cap_percent,uint8_t bat_id,uint8_t err_code,uint16_t hvb_voltage,int8_t hvb_temp)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    char buf[MAVLINK_MSG_ID_SHANGFEI_BMS_LEN];
+    _mav_put_uint32_t(buf, 0, time_boot_ms);
+    _mav_put_uint16_t(buf, 4, bat_voltage);
+    _mav_put_int16_t(buf, 6, bat_current);
+    _mav_put_uint16_t(buf, 8, hvb_voltage);
+    _mav_put_int8_t(buf, 10, bat_maxtemp);
+    _mav_put_uint8_t(buf, 11, cap_percent);
+    _mav_put_uint8_t(buf, 12, bat_id);
+    _mav_put_uint8_t(buf, 13, err_code);
+    _mav_put_int8_t(buf, 14, hvb_temp);
+
+        memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#else
+    mavlink_shangfei_bms_t packet;
+    packet.time_boot_ms = time_boot_ms;
+    packet.bat_voltage = bat_voltage;
+    packet.bat_current = bat_current;
+    packet.hvb_voltage = hvb_voltage;
+    packet.bat_maxtemp = bat_maxtemp;
+    packet.cap_percent = cap_percent;
+    packet.bat_id = bat_id;
+    packet.err_code = err_code;
+    packet.hvb_temp = hvb_temp;
+
+        memcpy(_MAV_PAYLOAD_NON_CONST(msg), &packet, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+#endif
+
+    msg->msgid = MAVLINK_MSG_ID_SHANGFEI_BMS;
+    return mavlink_finalize_message_chan(msg, system_id, component_id, chan, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+}
+
+/**
+ * @brief Encode a shangfei_bms struct
+ *
+ * @param system_id ID of this system
+ * @param component_id ID of this component (e.g. 200 for IMU)
+ * @param msg The MAVLink message to compress the data into
+ * @param shangfei_bms C-struct to read the message contents from
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_encode(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg, const mavlink_shangfei_bms_t* shangfei_bms)
+{
+    return mavlink_msg_shangfei_bms_pack(system_id, component_id, msg, shangfei_bms->time_boot_ms, shangfei_bms->bat_voltage, shangfei_bms->bat_current, shangfei_bms->bat_maxtemp, shangfei_bms->cap_percent, shangfei_bms->bat_id, shangfei_bms->err_code, shangfei_bms->hvb_voltage, shangfei_bms->hvb_temp);
+}
+
+/**
+ * @brief Encode a shangfei_bms struct on a channel
+ *
+ * @param system_id ID of this system
+ * @param component_id ID of this component (e.g. 200 for IMU)
+ * @param chan The MAVLink channel this message will be sent over
+ * @param msg The MAVLink message to compress the data into
+ * @param shangfei_bms C-struct to read the message contents from
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_encode_chan(uint8_t system_id, uint8_t component_id, uint8_t chan, mavlink_message_t* msg, const mavlink_shangfei_bms_t* shangfei_bms)
+{
+    return mavlink_msg_shangfei_bms_pack_chan(system_id, component_id, chan, msg, shangfei_bms->time_boot_ms, shangfei_bms->bat_voltage, shangfei_bms->bat_current, shangfei_bms->bat_maxtemp, shangfei_bms->cap_percent, shangfei_bms->bat_id, shangfei_bms->err_code, shangfei_bms->hvb_voltage, shangfei_bms->hvb_temp);
+}
+
+/**
+ * @brief Encode a shangfei_bms struct with provided status structure
+ *
+ * @param system_id ID of this system
+ * @param component_id ID of this component (e.g. 200 for IMU)
+ * @param status MAVLink status structure
+ * @param msg The MAVLink message to compress the data into
+ * @param shangfei_bms C-struct to read the message contents from
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_encode_status(uint8_t system_id, uint8_t component_id, mavlink_status_t* _status, mavlink_message_t* msg, const mavlink_shangfei_bms_t* shangfei_bms)
+{
+    return mavlink_msg_shangfei_bms_pack_status(system_id, component_id, _status, msg,  shangfei_bms->time_boot_ms, shangfei_bms->bat_voltage, shangfei_bms->bat_current, shangfei_bms->bat_maxtemp, shangfei_bms->cap_percent, shangfei_bms->bat_id, shangfei_bms->err_code, shangfei_bms->hvb_voltage, shangfei_bms->hvb_temp);
+}
+
+/**
+ * @brief Send a shangfei_bms message
+ * @param chan MAVLink channel to send the message
+ *
+ * @param time_boot_ms [ms] Timestamp in ms from system boot.
+ * @param bat_voltage [dV] Battery voltage.
+ * @param bat_current [dA] Battery current.
+ * @param bat_maxtemp  Battery Max_temperature.
+ * @param cap_percent [%] Battery capacity.
+ * @param bat_id  Battery id.
+ * @param err_code  Error code.
+ * @param hvb_voltage [dV] High volt-box voltage.
+ * @param hvb_temp  High volt-box temperature.
+ */
+#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
+
+static inline void mavlink_msg_shangfei_bms_send(mavlink_channel_t chan, uint32_t time_boot_ms, uint16_t bat_voltage, int16_t bat_current, int8_t bat_maxtemp, uint8_t cap_percent, uint8_t bat_id, uint8_t err_code, uint16_t hvb_voltage, int8_t hvb_temp)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    char buf[MAVLINK_MSG_ID_SHANGFEI_BMS_LEN];
+    _mav_put_uint32_t(buf, 0, time_boot_ms);
+    _mav_put_uint16_t(buf, 4, bat_voltage);
+    _mav_put_int16_t(buf, 6, bat_current);
+    _mav_put_uint16_t(buf, 8, hvb_voltage);
+    _mav_put_int8_t(buf, 10, bat_maxtemp);
+    _mav_put_uint8_t(buf, 11, cap_percent);
+    _mav_put_uint8_t(buf, 12, bat_id);
+    _mav_put_uint8_t(buf, 13, err_code);
+    _mav_put_int8_t(buf, 14, hvb_temp);
+
+    _mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_SHANGFEI_BMS, buf, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+#else
+    mavlink_shangfei_bms_t packet;
+    packet.time_boot_ms = time_boot_ms;
+    packet.bat_voltage = bat_voltage;
+    packet.bat_current = bat_current;
+    packet.hvb_voltage = hvb_voltage;
+    packet.bat_maxtemp = bat_maxtemp;
+    packet.cap_percent = cap_percent;
+    packet.bat_id = bat_id;
+    packet.err_code = err_code;
+    packet.hvb_temp = hvb_temp;
+
+    _mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_SHANGFEI_BMS, (const char *)&packet, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+#endif
+}
+
+/**
+ * @brief Send a shangfei_bms message
+ * @param chan MAVLink channel to send the message
+ * @param struct The MAVLink struct to serialize
+ */
+static inline void mavlink_msg_shangfei_bms_send_struct(mavlink_channel_t chan, const mavlink_shangfei_bms_t* shangfei_bms)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    mavlink_msg_shangfei_bms_send(chan, shangfei_bms->time_boot_ms, shangfei_bms->bat_voltage, shangfei_bms->bat_current, shangfei_bms->bat_maxtemp, shangfei_bms->cap_percent, shangfei_bms->bat_id, shangfei_bms->err_code, shangfei_bms->hvb_voltage, shangfei_bms->hvb_temp);
+#else
+    _mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_SHANGFEI_BMS, (const char *)shangfei_bms, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+#endif
+}
+
+#if MAVLINK_MSG_ID_SHANGFEI_BMS_LEN <= MAVLINK_MAX_PAYLOAD_LEN
+/*
+  This variant of _send() can be used to save stack space by re-using
+  memory from the receive buffer.  The caller provides a
+  mavlink_message_t which is the size of a full mavlink message. This
+  is usually the receive buffer for the channel, and allows a reply to an
+  incoming message with minimum stack space usage.
+ */
+static inline void mavlink_msg_shangfei_bms_send_buf(mavlink_message_t *msgbuf, mavlink_channel_t chan,  uint32_t time_boot_ms, uint16_t bat_voltage, int16_t bat_current, int8_t bat_maxtemp, uint8_t cap_percent, uint8_t bat_id, uint8_t err_code, uint16_t hvb_voltage, int8_t hvb_temp)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    char *buf = (char *)msgbuf;
+    _mav_put_uint32_t(buf, 0, time_boot_ms);
+    _mav_put_uint16_t(buf, 4, bat_voltage);
+    _mav_put_int16_t(buf, 6, bat_current);
+    _mav_put_uint16_t(buf, 8, hvb_voltage);
+    _mav_put_int8_t(buf, 10, bat_maxtemp);
+    _mav_put_uint8_t(buf, 11, cap_percent);
+    _mav_put_uint8_t(buf, 12, bat_id);
+    _mav_put_uint8_t(buf, 13, err_code);
+    _mav_put_int8_t(buf, 14, hvb_temp);
+
+    _mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_SHANGFEI_BMS, buf, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+#else
+    mavlink_shangfei_bms_t *packet = (mavlink_shangfei_bms_t *)msgbuf;
+    packet->time_boot_ms = time_boot_ms;
+    packet->bat_voltage = bat_voltage;
+    packet->bat_current = bat_current;
+    packet->hvb_voltage = hvb_voltage;
+    packet->bat_maxtemp = bat_maxtemp;
+    packet->cap_percent = cap_percent;
+    packet->bat_id = bat_id;
+    packet->err_code = err_code;
+    packet->hvb_temp = hvb_temp;
+
+    _mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_SHANGFEI_BMS, (const char *)packet, MAVLINK_MSG_ID_SHANGFEI_BMS_MIN_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN, MAVLINK_MSG_ID_SHANGFEI_BMS_CRC);
+#endif
+}
+#endif
+
+#endif
+
+// MESSAGE SHANGFEI_BMS UNPACKING
+
+
+/**
+ * @brief Get field time_boot_ms from shangfei_bms message
+ *
+ * @return [ms] Timestamp in ms from system boot.
+ */
+static inline uint32_t mavlink_msg_shangfei_bms_get_time_boot_ms(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_uint32_t(msg,  0);
+}
+
+/**
+ * @brief Get field bat_voltage from shangfei_bms message
+ *
+ * @return [dV] Battery voltage.
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_get_bat_voltage(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_uint16_t(msg,  4);
+}
+
+/**
+ * @brief Get field bat_current from shangfei_bms message
+ *
+ * @return [dA] Battery current.
+ */
+static inline int16_t mavlink_msg_shangfei_bms_get_bat_current(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_int16_t(msg,  6);
+}
+
+/**
+ * @brief Get field bat_maxtemp from shangfei_bms message
+ *
+ * @return  Battery Max_temperature.
+ */
+static inline int8_t mavlink_msg_shangfei_bms_get_bat_maxtemp(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_int8_t(msg,  10);
+}
+
+/**
+ * @brief Get field cap_percent from shangfei_bms message
+ *
+ * @return [%] Battery capacity.
+ */
+static inline uint8_t mavlink_msg_shangfei_bms_get_cap_percent(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_uint8_t(msg,  11);
+}
+
+/**
+ * @brief Get field bat_id from shangfei_bms message
+ *
+ * @return  Battery id.
+ */
+static inline uint8_t mavlink_msg_shangfei_bms_get_bat_id(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_uint8_t(msg,  12);
+}
+
+/**
+ * @brief Get field err_code from shangfei_bms message
+ *
+ * @return  Error code.
+ */
+static inline uint8_t mavlink_msg_shangfei_bms_get_err_code(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_uint8_t(msg,  13);
+}
+
+/**
+ * @brief Get field hvb_voltage from shangfei_bms message
+ *
+ * @return [dV] High volt-box voltage.
+ */
+static inline uint16_t mavlink_msg_shangfei_bms_get_hvb_voltage(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_uint16_t(msg,  8);
+}
+
+/**
+ * @brief Get field hvb_temp from shangfei_bms message
+ *
+ * @return  High volt-box temperature.
+ */
+static inline int8_t mavlink_msg_shangfei_bms_get_hvb_temp(const mavlink_message_t* msg)
+{
+    return _MAV_RETURN_int8_t(msg,  14);
+}
+
+/**
+ * @brief Decode a shangfei_bms message into a struct
+ *
+ * @param msg The message to decode
+ * @param shangfei_bms C-struct to decode the message contents into
+ */
+static inline void mavlink_msg_shangfei_bms_decode(const mavlink_message_t* msg, mavlink_shangfei_bms_t* shangfei_bms)
+{
+#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
+    shangfei_bms->time_boot_ms = mavlink_msg_shangfei_bms_get_time_boot_ms(msg);
+    shangfei_bms->bat_voltage = mavlink_msg_shangfei_bms_get_bat_voltage(msg);
+    shangfei_bms->bat_current = mavlink_msg_shangfei_bms_get_bat_current(msg);
+    shangfei_bms->hvb_voltage = mavlink_msg_shangfei_bms_get_hvb_voltage(msg);
+    shangfei_bms->bat_maxtemp = mavlink_msg_shangfei_bms_get_bat_maxtemp(msg);
+    shangfei_bms->cap_percent = mavlink_msg_shangfei_bms_get_cap_percent(msg);
+    shangfei_bms->bat_id = mavlink_msg_shangfei_bms_get_bat_id(msg);
+    shangfei_bms->err_code = mavlink_msg_shangfei_bms_get_err_code(msg);
+    shangfei_bms->hvb_temp = mavlink_msg_shangfei_bms_get_hvb_temp(msg);
+#else
+        uint8_t len = msg->len < MAVLINK_MSG_ID_SHANGFEI_BMS_LEN? msg->len : MAVLINK_MSG_ID_SHANGFEI_BMS_LEN;
+        memset(shangfei_bms, 0, MAVLINK_MSG_ID_SHANGFEI_BMS_LEN);
+    memcpy(shangfei_bms, _MAV_PAYLOAD(msg), len);
+#endif
+}