|
|
|
@ -20,7 +20,7 @@
@@ -20,7 +20,7 @@
|
|
|
|
|
#include <string.h> |
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
#define ZR_API_DEBUG 0 |
|
|
|
|
#define ZR_API_DEBUG 1 |
|
|
|
|
#if ZR_API_DEBUG |
|
|
|
|
# define Debug(fmt, args ...) gcs().send_text(MAV_SEVERITY_INFO, "{%d}," fmt , __LINE__, ## args) |
|
|
|
|
// # define Debug(fmt, args ...) gcs().send_text(MAV_SEVERITY_INFO, "NOTICE:" fmt , ## args)
|
|
|
|
@ -50,11 +50,11 @@ void AC_ZR_Serial_API::init(const AP_SerialManager& serial_manager)
@@ -50,11 +50,11 @@ void AC_ZR_Serial_API::init(const AP_SerialManager& serial_manager)
|
|
|
|
|
if(_zr_api_port == nullptr ) |
|
|
|
|
_zr_api_port = serial_manager.find_serial(AP_SerialManager::SerialProtocol_ZR_Serial_API, 0); |
|
|
|
|
|
|
|
|
|
uint32_t baudrate = 460800U; |
|
|
|
|
// uint32_t baudrate = 460800U;
|
|
|
|
|
bool init_host; |
|
|
|
|
if(_zr_api_port != nullptr ){ |
|
|
|
|
_zr_api_port->begin(baudrate); |
|
|
|
|
_zr_api_port->set_flow_control(AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE); |
|
|
|
|
// _zr_api_port->begin(baudrate);
|
|
|
|
|
// _zr_api_port->set_flow_control(AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE);
|
|
|
|
|
init_host = true; |
|
|
|
|
}else{ |
|
|
|
|
init_host = false; |
|
|
|
@ -88,7 +88,7 @@ void AC_ZR_Serial_API::write_data_to_port(AP_HAL::UARTDriver *_port, const uint8
@@ -88,7 +88,7 @@ void AC_ZR_Serial_API::write_data_to_port(AP_HAL::UARTDriver *_port, const uint8
|
|
|
|
|
* @brief 读取串口数据 |
|
|
|
|
*
|
|
|
|
|
* @param _port 选择要读取的串口,_zr_api_port |
|
|
|
|
* @param data mav_data_from_host[350],serial_data_from_device[350] |
|
|
|
|
* @param data serial_data_from_device[CONTROL_DATA_LEN] |
|
|
|
|
* @param len mav_data_len,device_data_len |
|
|
|
|
*/ |
|
|
|
|
void AC_ZR_Serial_API::read_data_from_port(AP_HAL::UARTDriver *_port,uint8_t *data, uint8_t *len) |
|
|
|
@ -134,39 +134,76 @@ void AC_ZR_Serial_API::get_vehicle_euler_angles(Vector3f euler)
@@ -134,39 +134,76 @@ void AC_ZR_Serial_API::get_vehicle_euler_angles(Vector3f euler)
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::get_vehicle_flight_data(Vector3f pos,Vector3f euler,Vector3f vel,uint8_t mode,uint8_t in_air) |
|
|
|
|
void AC_ZR_Serial_API::get_vehicle_flight_data(Vector3l pos,Vector3l vel,Vector3f euler,uint8_t mode,uint8_t in_air) |
|
|
|
|
{ |
|
|
|
|
uint8_t crc_sum = 0; |
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.msg_head = 0xfe; |
|
|
|
|
flight_data_parser.data_msg.msg_length = PARSER_DATA_LEN; |
|
|
|
|
flight_data_parser.data_msg.msg_head = MSG_HEAD; |
|
|
|
|
flight_data_parser.data_msg.msg_mode = ZR_Msg_Type::MSG_FLIGHT_DATA; |
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.time_ms = AP_HAL::millis(); |
|
|
|
|
// flight_data_parser.data_msg.time_ms = AP_HAL::millis();
|
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.flight_data.lat = pos.x; |
|
|
|
|
flight_data_parser.data_msg.flight_data.lng = pos.y; |
|
|
|
|
flight_data_parser.data_msg.flight_data.alt = pos.z; |
|
|
|
|
flight_data_parser.data_msg.fly_mode = mode; |
|
|
|
|
flight_data_parser.data_msg.fly_status = in_air; |
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.flight_data.roll = euler.x; |
|
|
|
|
flight_data_parser.data_msg.flight_data.pitch = euler.y; |
|
|
|
|
flight_data_parser.data_msg.flight_data.yaw = euler.z; |
|
|
|
|
flight_data_parser.data_msg.lat = pos.x; |
|
|
|
|
flight_data_parser.data_msg.lng = pos.y; |
|
|
|
|
flight_data_parser.data_msg.alt = pos.z; |
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.flight_data.vx = vel.x; |
|
|
|
|
flight_data_parser.data_msg.flight_data.vy = vel.y; |
|
|
|
|
flight_data_parser.data_msg.flight_data.vz = vel.z; |
|
|
|
|
flight_data_parser.data_msg.vx = vel.x; |
|
|
|
|
flight_data_parser.data_msg.vy = vel.y; |
|
|
|
|
flight_data_parser.data_msg.vz = vel.z; |
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.roll = euler.x; |
|
|
|
|
flight_data_parser.data_msg.pitch = euler.y; |
|
|
|
|
flight_data_parser.data_msg.yaw = euler.z; |
|
|
|
|
|
|
|
|
|
flight_data_parser.data_msg.flight_data.state = UINT16_VALUE(mode, in_air); |
|
|
|
|
for (size_t i = 0; i < 40; i++) |
|
|
|
|
{ |
|
|
|
|
crc_sum += flight_data_parser.data[i]; |
|
|
|
|
} |
|
|
|
|
flight_data_parser.data_msg.crc = crc_sum; |
|
|
|
|
write_data_to_port(_zr_api_port,flight_data_parser.data, PARSER_DATA_LEN); |
|
|
|
|
if(0){ |
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO, "{%d},%.4f,%.4f,%.4f" , __LINE__,flight_data_parser.data_msg.flight_data.lat, \
|
|
|
|
|
flight_data_parser.data_msg.flight_data.roll ,\
|
|
|
|
|
flight_data_parser.data_msg.flight_data.vx ); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 获取串口接收到的控制数据 |
|
|
|
|
*
|
|
|
|
|
* @param mode 控制模式,速度模式,位置模式 |
|
|
|
|
* @param data 控制的数据,根据mode决定是速度还是位置 |
|
|
|
|
* @param yaw_deg 偏航角 |
|
|
|
|
* @return true
|
|
|
|
|
* @return false
|
|
|
|
|
*/ |
|
|
|
|
bool AC_ZR_Serial_API::get_control_data(ZR_Msg_Type &mode,Vector3l &data,float &yaw_deg) |
|
|
|
|
{ |
|
|
|
|
static uint32_t last_time = 0; |
|
|
|
|
uint8_t crc_clc = 0; |
|
|
|
|
|
|
|
|
|
if(control_data_last_time == last_time){ // 数据没更新,直接退出
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
last_time = control_data_last_time; |
|
|
|
|
if(flight_control_parser.msg.head != MSG_HEAD){ // 帧头
|
|
|
|
|
Debug("head error: %02x",flight_control_parser.msg.head ); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// crc 校验
|
|
|
|
|
for (size_t i = 1; i < CONTROL_DATA_LEN - 1; i++) |
|
|
|
|
{ |
|
|
|
|
crc_clc += flight_control_parser.data[i]; |
|
|
|
|
} |
|
|
|
|
if(crc_clc != flight_control_parser.data[CONTROL_DATA_LEN - 1]){ |
|
|
|
|
Debug("crc error clc: %02x ,rece: %02x",crc_clc,flight_control_parser.msg.crc); |
|
|
|
|
return false; // 校验失败
|
|
|
|
|
} |
|
|
|
|
mode = flight_control_parser.msg.mode; |
|
|
|
|
// 速度或者位置,3个float
|
|
|
|
|
memcpy(&data,flight_control_parser.data + 2,12); |
|
|
|
|
yaw_deg = flight_control_parser.msg.yaw; |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::update(void) |
|
|
|
@ -178,11 +215,14 @@ void AC_ZR_Serial_API::update(void)
@@ -178,11 +215,14 @@ void AC_ZR_Serial_API::update(void)
|
|
|
|
|
|
|
|
|
|
// Debug("receive host data:%d",mav_data_len);
|
|
|
|
|
uint32_t now_time = AP_HAL::millis(); |
|
|
|
|
if(serial_data_len > 0 && (now_time - serial_last_data_time > 50)){ |
|
|
|
|
mav_len = serial_data_len; |
|
|
|
|
Debug("%d,device data len:%d",now_time,mav_len); |
|
|
|
|
if(serial_data_len > 0 && (now_time - serial_last_data_time > 50)){ // 接收可能被中断,延时一段
|
|
|
|
|
Debug("%d,receive len:%d",now_time,serial_data_len); |
|
|
|
|
if(serial_data_len == CONTROL_DATA_LEN){ // 正常控制指令都是 CONTROL_DATA_LEN 长度
|
|
|
|
|
memcpy(flight_control_parser.data,serial_data_from_device,serial_data_len); |
|
|
|
|
control_data_last_time = AP_HAL::millis(); |
|
|
|
|
} |
|
|
|
|
serial_data_len = 0; |
|
|
|
|
memset(serial_data_from_device,0,PARSER_DATA_LEN); |
|
|
|
|
// memset(serial_data_from_device,0,CONTROL_DATA_LEN);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// if(get_mav_data){
|
|
|
|
|