Commit 5c67ab69 authored by Léo-Paul Géneau's avatar Léo-Paul Géneau 👾

Store xml files instead of generated headers

parent 0ab8d14e
This diff is collapsed.
#pragma once
#if defined(MAVLINK_USE_CXX_NAMESPACE)
namespace mavlink {
#elif defined(__cplusplus)
extern "C" {
#endif
// Visual Studio versions before 2010 don't have stdint.h, so we just error out.
#if (defined _MSC_VER) && (_MSC_VER < 1600)
#error "The C-MAVLink implementation requires Visual Studio 2010 or greater"
#endif
#include <stdint.h>
/**
*
* CALCULATE THE CHECKSUM
*
*/
#define X25_INIT_CRC 0xffff
#define X25_VALIDATE_CRC 0xf0b8
#ifndef HAVE_CRC_ACCUMULATE
/**
* @brief Accumulate the CRC16_MCRF4XX checksum by adding one char at a time.
*
* The checksum function adds the hash of one char at a time to the
* 16 bit checksum (uint16_t).
*
* @param data new char to hash
* @param crcAccum the already accumulated checksum
**/
static inline void crc_accumulate(uint8_t data, uint16_t *crcAccum)
{
/*Accumulate one byte of data into the CRC*/
uint8_t tmp;
tmp = data ^ (uint8_t)(*crcAccum &0xff);
tmp ^= (tmp<<4);
*crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
}
#endif
/**
* @brief Initialize the buffer for the MCRF4XX CRC16
*
* @param crcAccum the 16 bit MCRF4XX CRC16
*/
static inline void crc_init(uint16_t* crcAccum)
{
*crcAccum = X25_INIT_CRC;
}
/**
* @brief Calculates the CRC16_MCRF4XX checksum on a byte buffer
*
* @param pBuffer buffer containing the byte array to hash
* @param length length of the byte array
* @return the checksum over the buffer bytes
**/
static inline uint16_t crc_calculate(const uint8_t* pBuffer, uint16_t length)
{
uint16_t crcTmp;
crc_init(&crcTmp);
while (length--) {
crc_accumulate(*pBuffer++, &crcTmp);
}
return crcTmp;
}
/**
* @brief Accumulate the MCRF4XX CRC16 by adding an array of bytes
*
* The checksum function adds the hash of one char at a time to the
* 16 bit checksum (uint16_t).
*
* @param data new bytes to hash
* @param crcAccum the already accumulated checksum
**/
static inline void crc_accumulate_buffer(uint16_t *crcAccum, const char *pBuffer, uint16_t length)
{
const uint8_t *p = (const uint8_t *)pBuffer;
while (length--) {
crc_accumulate(*p++, crcAccum);
}
}
#if defined(MAVLINK_USE_CXX_NAMESPACE) || defined(__cplusplus)
}
#endif
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
/** @file
* @brief MAVLink comm protocol built from common.xml
* @see http://mavlink.org
*/
#pragma once
#ifndef MAVLINK_H
#define MAVLINK_H
#define MAVLINK_PRIMARY_XML_HASH -4223721478284723775
#ifndef MAVLINK_STX
#define MAVLINK_STX 253
#endif
#ifndef MAVLINK_ENDIAN
#define MAVLINK_ENDIAN MAVLINK_LITTLE_ENDIAN
#endif
#ifndef MAVLINK_ALIGNED_FIELDS
#define MAVLINK_ALIGNED_FIELDS 1
#endif
#ifndef MAVLINK_CRC_EXTRA
#define MAVLINK_CRC_EXTRA 1
#endif
#ifndef MAVLINK_COMMAND_24BIT
#define MAVLINK_COMMAND_24BIT 1
#endif
#include "version.h"
#include "common.h"
#endif // MAVLINK_H
// MESSAGE ACTUATOR_CONTROL_TARGET support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ACTUATOR_CONTROL_TARGET message
*
* Set the vehicle attitude and body angular rates.
*/
struct ACTUATOR_CONTROL_TARGET : mavlink::Message {
static constexpr msgid_t MSG_ID = 140;
static constexpr size_t LENGTH = 41;
static constexpr size_t MIN_LENGTH = 41;
static constexpr uint8_t CRC_EXTRA = 181;
static constexpr auto NAME = "ACTUATOR_CONTROL_TARGET";
uint64_t time_usec; /*< [us] Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number. */
uint8_t group_mlx; /*< Actuator group. The "_mlx" indicates this is a multi-instance message and a MAVLink parser should use this field to difference between instances. */
std::array<float, 8> controls; /*< Actuator controls. Normed to -1..+1 where 0 is neutral position. Throttle for single rotation direction motors is 0..1, negative range for reverse direction. Standard mapping for attitude controls (group 0): (index 0-7): roll, pitch, yaw, throttle, flaps, spoilers, airbrakes, landing gear. Load a pass-through mixer to repurpose them as generic outputs. */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_usec: " << time_usec << std::endl;
ss << " group_mlx: " << +group_mlx << std::endl;
ss << " controls: [" << to_string(controls) << "]" << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_usec; // offset: 0
map << controls; // offset: 8
map << group_mlx; // offset: 40
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_usec; // offset: 0
map >> controls; // offset: 8
map >> group_mlx; // offset: 40
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
// MESSAGE ACTUATOR_OUTPUT_STATUS support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ACTUATOR_OUTPUT_STATUS message
*
* The raw values of the actuator outputs (e.g. on Pixhawk, from MAIN, AUX ports). This message supersedes SERVO_OUTPUT_RAW.
*/
struct ACTUATOR_OUTPUT_STATUS : mavlink::Message {
static constexpr msgid_t MSG_ID = 375;
static constexpr size_t LENGTH = 140;
static constexpr size_t MIN_LENGTH = 140;
static constexpr uint8_t CRC_EXTRA = 251;
static constexpr auto NAME = "ACTUATOR_OUTPUT_STATUS";
uint64_t time_usec; /*< [us] Timestamp (since system boot). */
uint32_t active; /*< Active outputs */
std::array<float, 32> actuator; /*< Servo / motor output array values. Zero values indicate unused channels. */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_usec: " << time_usec << std::endl;
ss << " active: " << active << std::endl;
ss << " actuator: [" << to_string(actuator) << "]" << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_usec; // offset: 0
map << active; // offset: 8
map << actuator; // offset: 12
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_usec; // offset: 0
map >> active; // offset: 8
map >> actuator; // offset: 12
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE ADSB_VEHICLE support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ADSB_VEHICLE message
*
* The location and information of an ADSB vehicle
*/
struct ADSB_VEHICLE : mavlink::Message {
static constexpr msgid_t MSG_ID = 246;
static constexpr size_t LENGTH = 38;
static constexpr size_t MIN_LENGTH = 38;
static constexpr uint8_t CRC_EXTRA = 184;
static constexpr auto NAME = "ADSB_VEHICLE";
uint32_t ICAO_address; /*< ICAO address */
int32_t lat; /*< [degE7] Latitude */
int32_t lon; /*< [degE7] Longitude */
uint8_t altitude_type; /*< ADSB altitude type. */
int32_t altitude; /*< [mm] Altitude(ASL) */
uint16_t heading; /*< [cdeg] Course over ground */
uint16_t hor_velocity; /*< [cm/s] The horizontal velocity */
int16_t ver_velocity; /*< [cm/s] The vertical velocity. Positive is up */
std::array<char, 9> callsign; /*< The callsign, 8+null */
uint8_t emitter_type; /*< ADSB emitter type. */
uint8_t tslc; /*< [s] Time since last communication in seconds */
uint16_t flags; /*< Bitmap to indicate various statuses including valid data fields */
uint16_t squawk; /*< Squawk code */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " ICAO_address: " << ICAO_address << std::endl;
ss << " lat: " << lat << std::endl;
ss << " lon: " << lon << std::endl;
ss << " altitude_type: " << +altitude_type << std::endl;
ss << " altitude: " << altitude << std::endl;
ss << " heading: " << heading << std::endl;
ss << " hor_velocity: " << hor_velocity << std::endl;
ss << " ver_velocity: " << ver_velocity << std::endl;
ss << " callsign: \"" << to_string(callsign) << "\"" << std::endl;
ss << " emitter_type: " << +emitter_type << std::endl;
ss << " tslc: " << +tslc << std::endl;
ss << " flags: " << flags << std::endl;
ss << " squawk: " << squawk << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << ICAO_address; // offset: 0
map << lat; // offset: 4
map << lon; // offset: 8
map << altitude; // offset: 12
map << heading; // offset: 16
map << hor_velocity; // offset: 18
map << ver_velocity; // offset: 20
map << flags; // offset: 22
map << squawk; // offset: 24
map << altitude_type; // offset: 26
map << callsign; // offset: 27
map << emitter_type; // offset: 36
map << tslc; // offset: 37
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> ICAO_address; // offset: 0
map >> lat; // offset: 4
map >> lon; // offset: 8
map >> altitude; // offset: 12
map >> heading; // offset: 16
map >> hor_velocity; // offset: 18
map >> ver_velocity; // offset: 20
map >> flags; // offset: 22
map >> squawk; // offset: 24
map >> altitude_type; // offset: 26
map >> callsign; // offset: 27
map >> emitter_type; // offset: 36
map >> tslc; // offset: 37
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE AIS_VESSEL support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief AIS_VESSEL message
*
* The location and information of an AIS vessel
*/
struct AIS_VESSEL : mavlink::Message {
static constexpr msgid_t MSG_ID = 301;
static constexpr size_t LENGTH = 58;
static constexpr size_t MIN_LENGTH = 58;
static constexpr uint8_t CRC_EXTRA = 243;
static constexpr auto NAME = "AIS_VESSEL";
uint32_t MMSI; /*< Mobile Marine Service Identifier, 9 decimal digits */
int32_t lat; /*< [degE7] Latitude */
int32_t lon; /*< [degE7] Longitude */
uint16_t COG; /*< [cdeg] Course over ground */
uint16_t heading; /*< [cdeg] True heading */
uint16_t velocity; /*< [cm/s] Speed over ground */
int8_t turn_rate; /*< [cdeg/s] Turn rate */
uint8_t navigational_status; /*< Navigational status */
uint8_t type; /*< Type of vessels */
uint16_t dimension_bow; /*< [m] Distance from lat/lon location to bow */
uint16_t dimension_stern; /*< [m] Distance from lat/lon location to stern */
uint8_t dimension_port; /*< [m] Distance from lat/lon location to port side */
uint8_t dimension_starboard; /*< [m] Distance from lat/lon location to starboard side */
std::array<char, 7> callsign; /*< The vessel callsign */
std::array<char, 20> name; /*< The vessel name */
uint16_t tslc; /*< [s] Time since last communication in seconds */
uint16_t flags; /*< Bitmask to indicate various statuses including valid data fields */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " MMSI: " << MMSI << std::endl;
ss << " lat: " << lat << std::endl;
ss << " lon: " << lon << std::endl;
ss << " COG: " << COG << std::endl;
ss << " heading: " << heading << std::endl;
ss << " velocity: " << velocity << std::endl;
ss << " turn_rate: " << +turn_rate << std::endl;
ss << " navigational_status: " << +navigational_status << std::endl;
ss << " type: " << +type << std::endl;
ss << " dimension_bow: " << dimension_bow << std::endl;
ss << " dimension_stern: " << dimension_stern << std::endl;
ss << " dimension_port: " << +dimension_port << std::endl;
ss << " dimension_starboard: " << +dimension_starboard << std::endl;
ss << " callsign: \"" << to_string(callsign) << "\"" << std::endl;
ss << " name: \"" << to_string(name) << "\"" << std::endl;
ss << " tslc: " << tslc << std::endl;
ss << " flags: " << flags << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << MMSI; // offset: 0
map << lat; // offset: 4
map << lon; // offset: 8
map << COG; // offset: 12
map << heading; // offset: 14
map << velocity; // offset: 16
map << dimension_bow; // offset: 18
map << dimension_stern; // offset: 20
map << tslc; // offset: 22
map << flags; // offset: 24
map << turn_rate; // offset: 26
map << navigational_status; // offset: 27
map << type; // offset: 28
map << dimension_port; // offset: 29
map << dimension_starboard; // offset: 30
map << callsign; // offset: 31
map << name; // offset: 38
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> MMSI; // offset: 0
map >> lat; // offset: 4
map >> lon; // offset: 8
map >> COG; // offset: 12
map >> heading; // offset: 14
map >> velocity; // offset: 16
map >> dimension_bow; // offset: 18
map >> dimension_stern; // offset: 20
map >> tslc; // offset: 22
map >> flags; // offset: 24
map >> turn_rate; // offset: 26
map >> navigational_status; // offset: 27
map >> type; // offset: 28
map >> dimension_port; // offset: 29
map >> dimension_starboard; // offset: 30
map >> callsign; // offset: 31
map >> name; // offset: 38
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE ALTITUDE support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ALTITUDE message
*
* The current system altitude.
*/
struct ALTITUDE : mavlink::Message {
static constexpr msgid_t MSG_ID = 141;
static constexpr size_t LENGTH = 32;
static constexpr size_t MIN_LENGTH = 32;
static constexpr uint8_t CRC_EXTRA = 47;
static constexpr auto NAME = "ALTITUDE";
uint64_t time_usec; /*< [us] Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number. */
float altitude_monotonic; /*< [m] This altitude measure is initialized on system boot and monotonic (it is never reset, but represents the local altitude change). The only guarantee on this field is that it will never be reset and is consistent within a flight. The recommended value for this field is the uncorrected barometric altitude at boot time. This altitude will also drift and vary between flights. */
float altitude_amsl; /*< [m] This altitude measure is strictly above mean sea level and might be non-monotonic (it might reset on events like GPS lock or when a new QNH value is set). It should be the altitude to which global altitude waypoints are compared to. Note that it is *not* the GPS altitude, however, most GPS modules already output MSL by default and not the WGS84 altitude. */
float altitude_local; /*< [m] This is the local altitude in the local coordinate frame. It is not the altitude above home, but in reference to the coordinate origin (0, 0, 0). It is up-positive. */
float altitude_relative; /*< [m] This is the altitude above the home position. It resets on each change of the current home position. */
float altitude_terrain; /*< [m] This is the altitude above terrain. It might be fed by a terrain database or an altimeter. Values smaller than -1000 should be interpreted as unknown. */
float bottom_clearance; /*< [m] This is not the altitude, but the clear space below the system according to the fused clearance estimate. It generally should max out at the maximum range of e.g. the laser altimeter. It is generally a moving target. A negative value indicates no measurement available. */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_usec: " << time_usec << std::endl;
ss << " altitude_monotonic: " << altitude_monotonic << std::endl;
ss << " altitude_amsl: " << altitude_amsl << std::endl;
ss << " altitude_local: " << altitude_local << std::endl;
ss << " altitude_relative: " << altitude_relative << std::endl;
ss << " altitude_terrain: " << altitude_terrain << std::endl;
ss << " bottom_clearance: " << bottom_clearance << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_usec; // offset: 0
map << altitude_monotonic; // offset: 8
map << altitude_amsl; // offset: 12
map << altitude_local; // offset: 16
map << altitude_relative; // offset: 20
map << altitude_terrain; // offset: 24
map << bottom_clearance; // offset: 28
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_usec; // offset: 0
map >> altitude_monotonic; // offset: 8
map >> altitude_amsl; // offset: 12
map >> altitude_local; // offset: 16
map >> altitude_relative; // offset: 20
map >> altitude_terrain; // offset: 24
map >> bottom_clearance; // offset: 28
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE ATT_POS_MOCAP support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ATT_POS_MOCAP message
*
* Motion capture attitude and position
*/
struct ATT_POS_MOCAP : mavlink::Message {
static constexpr msgid_t MSG_ID = 138;
static constexpr size_t LENGTH = 120;
static constexpr size_t MIN_LENGTH = 36;
static constexpr uint8_t CRC_EXTRA = 109;
static constexpr auto NAME = "ATT_POS_MOCAP";
uint64_t time_usec; /*< [us] Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number. */
std::array<float, 4> q; /*< Attitude quaternion (w, x, y, z order, zero-rotation is 1, 0, 0, 0) */
float x; /*< [m] X position (NED) */
float y; /*< [m] Y position (NED) */
float z; /*< [m] Z position (NED) */
std::array<float, 21> covariance; /*< Row-major representation of a pose 6x6 cross-covariance matrix upper right triangle (states: x, y, z, roll, pitch, yaw; first six entries are the first ROW, next five entries are the second ROW, etc.). If unknown, assign NaN value to first element in the array. */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_usec: " << time_usec << std::endl;
ss << " q: [" << to_string(q) << "]" << std::endl;
ss << " x: " << x << std::endl;
ss << " y: " << y << std::endl;
ss << " z: " << z << std::endl;
ss << " covariance: [" << to_string(covariance) << "]" << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_usec; // offset: 0
map << q; // offset: 8
map << x; // offset: 24
map << y; // offset: 28
map << z; // offset: 32
map << covariance; // offset: 36
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_usec; // offset: 0
map >> q; // offset: 8
map >> x; // offset: 24
map >> y; // offset: 28
map >> z; // offset: 32
map >> covariance; // offset: 36
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE ATTITUDE support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ATTITUDE message
*
* The attitude in the aeronautical frame (right-handed, Z-down, X-front, Y-right).
*/
struct ATTITUDE : mavlink::Message {
static constexpr msgid_t MSG_ID = 30;
static constexpr size_t LENGTH = 28;
static constexpr size_t MIN_LENGTH = 28;
static constexpr uint8_t CRC_EXTRA = 39;
static constexpr auto NAME = "ATTITUDE";
uint32_t time_boot_ms; /*< [ms] Timestamp (time since system boot). */
float roll; /*< [rad] Roll angle (-pi..+pi) */
float pitch; /*< [rad] Pitch angle (-pi..+pi) */
float yaw; /*< [rad] Yaw angle (-pi..+pi) */
float rollspeed; /*< [rad/s] Roll angular speed */
float pitchspeed; /*< [rad/s] Pitch angular speed */
float yawspeed; /*< [rad/s] Yaw angular speed */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_boot_ms: " << time_boot_ms << std::endl;
ss << " roll: " << roll << std::endl;
ss << " pitch: " << pitch << std::endl;
ss << " yaw: " << yaw << std::endl;
ss << " rollspeed: " << rollspeed << std::endl;
ss << " pitchspeed: " << pitchspeed << std::endl;
ss << " yawspeed: " << yawspeed << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_boot_ms; // offset: 0
map << roll; // offset: 4
map << pitch; // offset: 8
map << yaw; // offset: 12
map << rollspeed; // offset: 16
map << pitchspeed; // offset: 20
map << yawspeed; // offset: 24
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_boot_ms; // offset: 0
map >> roll; // offset: 4
map >> pitch; // offset: 8
map >> yaw; // offset: 12
map >> rollspeed; // offset: 16
map >> pitchspeed; // offset: 20
map >> yawspeed; // offset: 24
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE ATTITUDE_QUATERNION support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ATTITUDE_QUATERNION message
*
* The attitude in the aeronautical frame (right-handed, Z-down, X-front, Y-right), expressed as quaternion. Quaternion order is w, x, y, z and a zero rotation would be expressed as (1 0 0 0).
*/
struct ATTITUDE_QUATERNION : mavlink::Message {
static constexpr msgid_t MSG_ID = 31;
static constexpr size_t LENGTH = 48;
static constexpr size_t MIN_LENGTH = 32;
static constexpr uint8_t CRC_EXTRA = 246;
static constexpr auto NAME = "ATTITUDE_QUATERNION";
uint32_t time_boot_ms; /*< [ms] Timestamp (time since system boot). */
float q1; /*< Quaternion component 1, w (1 in null-rotation) */
float q2; /*< Quaternion component 2, x (0 in null-rotation) */
float q3; /*< Quaternion component 3, y (0 in null-rotation) */
float q4; /*< Quaternion component 4, z (0 in null-rotation) */
float rollspeed; /*< [rad/s] Roll angular speed */
float pitchspeed; /*< [rad/s] Pitch angular speed */
float yawspeed; /*< [rad/s] Yaw angular speed */
std::array<float, 4> repr_offset_q; /*< Rotation offset by which the attitude quaternion and angular speed vector should be rotated for user display (quaternion with [w, x, y, z] order, zero-rotation is [1, 0, 0, 0], send [0, 0, 0, 0] if field not supported). This field is intended for systems in which the reference attitude may change during flight. For example, tailsitters VTOLs rotate their reference attitude by 90 degrees between hover mode and fixed wing mode, thus repr_offset_q is equal to [1, 0, 0, 0] in hover mode and equal to [0.7071, 0, 0.7071, 0] in fixed wing mode. */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_boot_ms: " << time_boot_ms << std::endl;
ss << " q1: " << q1 << std::endl;
ss << " q2: " << q2 << std::endl;
ss << " q3: " << q3 << std::endl;
ss << " q4: " << q4 << std::endl;
ss << " rollspeed: " << rollspeed << std::endl;
ss << " pitchspeed: " << pitchspeed << std::endl;
ss << " yawspeed: " << yawspeed << std::endl;
ss << " repr_offset_q: [" << to_string(repr_offset_q) << "]" << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_boot_ms; // offset: 0
map << q1; // offset: 4
map << q2; // offset: 8
map << q3; // offset: 12
map << q4; // offset: 16
map << rollspeed; // offset: 20
map << pitchspeed; // offset: 24
map << yawspeed; // offset: 28
map << repr_offset_q; // offset: 32
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_boot_ms; // offset: 0
map >> q1; // offset: 4
map >> q2; // offset: 8
map >> q3; // offset: 12
map >> q4; // offset: 16
map >> rollspeed; // offset: 20
map >> pitchspeed; // offset: 24
map >> yawspeed; // offset: 28
map >> repr_offset_q; // offset: 32
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
// MESSAGE ATTITUDE_QUATERNION_COV support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ATTITUDE_QUATERNION_COV message
*
* The attitude in the aeronautical frame (right-handed, Z-down, X-front, Y-right), expressed as quaternion. Quaternion order is w, x, y, z and a zero rotation would be expressed as (1 0 0 0).
*/
struct ATTITUDE_QUATERNION_COV : mavlink::Message {
static constexpr msgid_t MSG_ID = 61;
static constexpr size_t LENGTH = 72;
static constexpr size_t MIN_LENGTH = 72;
static constexpr uint8_t CRC_EXTRA = 167;
static constexpr auto NAME = "ATTITUDE_QUATERNION_COV";
uint64_t time_usec; /*< [us] Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number. */
std::array<float, 4> q; /*< Quaternion components, w, x, y, z (1 0 0 0 is the null-rotation) */
float rollspeed; /*< [rad/s] Roll angular speed */
float pitchspeed; /*< [rad/s] Pitch angular speed */
float yawspeed; /*< [rad/s] Yaw angular speed */
std::array<float, 9> covariance; /*< Row-major representation of a 3x3 attitude covariance matrix (states: roll, pitch, yaw; first three entries are the first ROW, next three entries are the second row, etc.). If unknown, assign NaN value to first element in the array. */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_usec: " << time_usec << std::endl;
ss << " q: [" << to_string(q) << "]" << std::endl;
ss << " rollspeed: " << rollspeed << std::endl;
ss << " pitchspeed: " << pitchspeed << std::endl;
ss << " yawspeed: " << yawspeed << std::endl;
ss << " covariance: [" << to_string(covariance) << "]" << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_usec; // offset: 0
map << q; // offset: 8
map << rollspeed; // offset: 24
map << pitchspeed; // offset: 28
map << yawspeed; // offset: 32
map << covariance; // offset: 36
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_usec; // offset: 0
map >> q; // offset: 8
map >> rollspeed; // offset: 24
map >> pitchspeed; // offset: 28
map >> yawspeed; // offset: 32
map >> covariance; // offset: 36
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
This diff is collapsed.
// MESSAGE ATTITUDE_TARGET support class
#pragma once
namespace mavlink {
namespace common {
namespace msg {
/**
* @brief ATTITUDE_TARGET message
*
* Reports the current commanded attitude of the vehicle as specified by the autopilot. This should match the commands sent in a SET_ATTITUDE_TARGET message if the vehicle is being controlled this way.
*/
struct ATTITUDE_TARGET : mavlink::Message {
static constexpr msgid_t MSG_ID = 83;
static constexpr size_t LENGTH = 37;
static constexpr size_t MIN_LENGTH = 37;
static constexpr uint8_t CRC_EXTRA = 22;
static constexpr auto NAME = "ATTITUDE_TARGET";
uint32_t time_boot_ms; /*< [ms] Timestamp (time since system boot). */
uint8_t type_mask; /*< Bitmap to indicate which dimensions should be ignored by the vehicle. */
std::array<float, 4> q; /*< Attitude quaternion (w, x, y, z order, zero-rotation is 1, 0, 0, 0) */
float body_roll_rate; /*< [rad/s] Body roll rate */
float body_pitch_rate; /*< [rad/s] Body pitch rate */
float body_yaw_rate; /*< [rad/s] Body yaw rate */
float thrust; /*< Collective thrust, normalized to 0 .. 1 (-1 .. 1 for vehicles capable of reverse trust) */
inline std::string get_name(void) const override
{
return NAME;
}
inline Info get_message_info(void) const override
{
return { MSG_ID, LENGTH, MIN_LENGTH, CRC_EXTRA };
}
inline std::string to_yaml(void) const override
{
std::stringstream ss;
ss << NAME << ":" << std::endl;
ss << " time_boot_ms: " << time_boot_ms << std::endl;
ss << " type_mask: " << +type_mask << std::endl;
ss << " q: [" << to_string(q) << "]" << std::endl;
ss << " body_roll_rate: " << body_roll_rate << std::endl;
ss << " body_pitch_rate: " << body_pitch_rate << std::endl;
ss << " body_yaw_rate: " << body_yaw_rate << std::endl;
ss << " thrust: " << thrust << std::endl;
return ss.str();
}
inline void serialize(mavlink::MsgMap &map) const override
{
map.reset(MSG_ID, LENGTH);
map << time_boot_ms; // offset: 0
map << q; // offset: 4
map << body_roll_rate; // offset: 20
map << body_pitch_rate; // offset: 24
map << body_yaw_rate; // offset: 28
map << thrust; // offset: 32
map << type_mask; // offset: 36
}
inline void deserialize(mavlink::MsgMap &map) override
{
map >> time_boot_ms; // offset: 0
map >> q; // offset: 4
map >> body_roll_rate; // offset: 20
map >> body_pitch_rate; // offset: 24
map >> body_yaw_rate; // offset: 28
map >> thrust; // offset: 32
map >> type_mask; // offset: 36
}
};
} // namespace msg
} // namespace common
} // namespace mavlink
#pragma once
// MESSAGE AUTH_KEY PACKING
#define MAVLINK_MSG_ID_AUTH_KEY 7
typedef struct __mavlink_auth_key_t {
char key[32]; /*< key*/
} mavlink_auth_key_t;
#define MAVLINK_MSG_ID_AUTH_KEY_LEN 32
#define MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN 32
#define MAVLINK_MSG_ID_7_LEN 32
#define MAVLINK_MSG_ID_7_MIN_LEN 32
#define MAVLINK_MSG_ID_AUTH_KEY_CRC 119
#define MAVLINK_MSG_ID_7_CRC 119
#define MAVLINK_MSG_AUTH_KEY_FIELD_KEY_LEN 32
#if MAVLINK_COMMAND_24BIT
#define MAVLINK_MESSAGE_INFO_AUTH_KEY { \
7, \
"AUTH_KEY", \
1, \
{ { "key", NULL, MAVLINK_TYPE_CHAR, 32, 0, offsetof(mavlink_auth_key_t, key) }, \
} \
}
#else
#define MAVLINK_MESSAGE_INFO_AUTH_KEY { \
"AUTH_KEY", \
1, \
{ { "key", NULL, MAVLINK_TYPE_CHAR, 32, 0, offsetof(mavlink_auth_key_t, key) }, \
} \
}
#endif
/**
* @brief Pack a auth_key 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 key key
* @return length of the message in bytes (excluding serial stream start sign)
*/
static inline uint16_t mavlink_msg_auth_key_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg,
const char *key)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
char buf[MAVLINK_MSG_ID_AUTH_KEY_LEN];
_mav_put_char_array(buf, 0, key, 32);
memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_AUTH_KEY_LEN);
#else
mavlink_auth_key_t packet;
mav_array_memcpy(packet.key, key, sizeof(char)*32);
memcpy(_MAV_PAYLOAD_NON_CONST(msg), &packet, MAVLINK_MSG_ID_AUTH_KEY_LEN);
#endif
msg->msgid = MAVLINK_MSG_ID_AUTH_KEY;
return mavlink_finalize_message(msg, system_id, component_id, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
}
/**
* @brief Pack a auth_key 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 key key
* @return length of the message in bytes (excluding serial stream start sign)
*/
static inline uint16_t mavlink_msg_auth_key_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan,
mavlink_message_t* msg,
const char *key)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
char buf[MAVLINK_MSG_ID_AUTH_KEY_LEN];
_mav_put_char_array(buf, 0, key, 32);
memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_AUTH_KEY_LEN);
#else
mavlink_auth_key_t packet;
mav_array_memcpy(packet.key, key, sizeof(char)*32);
memcpy(_MAV_PAYLOAD_NON_CONST(msg), &packet, MAVLINK_MSG_ID_AUTH_KEY_LEN);
#endif
msg->msgid = MAVLINK_MSG_ID_AUTH_KEY;
return mavlink_finalize_message_chan(msg, system_id, component_id, chan, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
}
/**
* @brief Encode a auth_key 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 auth_key C-struct to read the message contents from
*/
static inline uint16_t mavlink_msg_auth_key_encode(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg, const mavlink_auth_key_t* auth_key)
{
return mavlink_msg_auth_key_pack(system_id, component_id, msg, auth_key->key);
}
/**
* @brief Encode a auth_key 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 auth_key C-struct to read the message contents from
*/
static inline uint16_t mavlink_msg_auth_key_encode_chan(uint8_t system_id, uint8_t component_id, uint8_t chan, mavlink_message_t* msg, const mavlink_auth_key_t* auth_key)
{
return mavlink_msg_auth_key_pack_chan(system_id, component_id, chan, msg, auth_key->key);
}
/**
* @brief Send a auth_key message
* @param chan MAVLink channel to send the message
*
* @param key key
*/
#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
static inline void mavlink_msg_auth_key_send(mavlink_channel_t chan, const char *key)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
char buf[MAVLINK_MSG_ID_AUTH_KEY_LEN];
_mav_put_char_array(buf, 0, key, 32);
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AUTH_KEY, buf, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
#else
mavlink_auth_key_t packet;
mav_array_memcpy(packet.key, key, sizeof(char)*32);
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AUTH_KEY, (const char *)&packet, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
#endif
}
/**
* @brief Send a auth_key message
* @param chan MAVLink channel to send the message
* @param struct The MAVLink struct to serialize
*/
static inline void mavlink_msg_auth_key_send_struct(mavlink_channel_t chan, const mavlink_auth_key_t* auth_key)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
mavlink_msg_auth_key_send(chan, auth_key->key);
#else
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AUTH_KEY, (const char *)auth_key, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
#endif
}
#if MAVLINK_MSG_ID_AUTH_KEY_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_auth_key_send_buf(mavlink_message_t *msgbuf, mavlink_channel_t chan, const char *key)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
char *buf = (char *)msgbuf;
_mav_put_char_array(buf, 0, key, 32);
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AUTH_KEY, buf, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
#else
mavlink_auth_key_t *packet = (mavlink_auth_key_t *)msgbuf;
mav_array_memcpy(packet->key, key, sizeof(char)*32);
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AUTH_KEY, (const char *)packet, MAVLINK_MSG_ID_AUTH_KEY_MIN_LEN, MAVLINK_MSG_ID_AUTH_KEY_LEN, MAVLINK_MSG_ID_AUTH_KEY_CRC);
#endif
}
#endif
#endif
// MESSAGE AUTH_KEY UNPACKING
/**
* @brief Get field key from auth_key message
*
* @return key
*/
static inline uint16_t mavlink_msg_auth_key_get_key(const mavlink_message_t* msg, char *key)
{
return _MAV_RETURN_char_array(msg, key, 32, 0);
}
/**
* @brief Decode a auth_key message into a struct
*
* @param msg The message to decode
* @param auth_key C-struct to decode the message contents into
*/
static inline void mavlink_msg_auth_key_decode(const mavlink_message_t* msg, mavlink_auth_key_t* auth_key)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
mavlink_msg_auth_key_get_key(msg, auth_key->key);
#else
uint8_t len = msg->len < MAVLINK_MSG_ID_AUTH_KEY_LEN? msg->len : MAVLINK_MSG_ID_AUTH_KEY_LEN;
memset(auth_key, 0, MAVLINK_MSG_ID_AUTH_KEY_LEN);
memcpy(auth_key, _MAV_PAYLOAD(msg), len);
#endif
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment