|
|
|
@ -33,6 +33,23 @@
@@ -33,6 +33,23 @@
|
|
|
|
|
|
|
|
|
|
AC_ZR_Serial_API *AC_ZR_Serial_API::_singleton; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// table of user settable parameters
|
|
|
|
|
const AP_Param::GroupInfo AC_ZR_Serial_API::var_info[] = { |
|
|
|
|
// @Param: _TYPE
|
|
|
|
|
// @DisplayName: user type
|
|
|
|
|
// @Description: parameters test
|
|
|
|
|
// @Values: 0:None,1:other
|
|
|
|
|
// @RebootRequired: True
|
|
|
|
|
// @User: zrzk
|
|
|
|
|
AP_GROUPINFO("_SER_DBG", 0, AC_ZR_Serial_API, parm_msg_debug, 1), |
|
|
|
|
|
|
|
|
|
AP_GROUPINFO("_SER_DAT_FQ", 1, AC_ZR_Serial_API, parm_data_freq, 10 ), |
|
|
|
|
AP_GROUPINFO("_SER_STU_FQ", 2, AC_ZR_Serial_API, parm_status_freq, 10), |
|
|
|
|
|
|
|
|
|
AP_GROUPEND |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// constructor
|
|
|
|
|
AC_ZR_Serial_API::AC_ZR_Serial_API() |
|
|
|
|
{ |
|
|
|
@ -67,7 +84,23 @@ void AC_ZR_Serial_API::init(const AP_SerialManager& serial_manager)
@@ -67,7 +84,23 @@ void AC_ZR_Serial_API::init(const AP_SerialManager& serial_manager)
|
|
|
|
|
data_trans_init = init_host; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::print_data( const char *fmt, ...) const |
|
|
|
|
{ |
|
|
|
|
// if (!parm_msg_debug) {
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, fmt );
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::print_msg( const char *msg) const |
|
|
|
|
{ |
|
|
|
|
// if (!parm_msg_debug) {
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, msg );
|
|
|
|
|
} |
|
|
|
|
/**
|
|
|
|
|
* @brief 数据写入串口 |
|
|
|
|
*
|
|
|
|
@ -138,127 +171,8 @@ void AC_ZR_Serial_API::read_data_from_port(AP_HAL::UARTDriver *_port,uint8_t *da
@@ -138,127 +171,8 @@ void AC_ZR_Serial_API::read_data_from_port(AP_HAL::UARTDriver *_port,uint8_t *da
|
|
|
|
|
*len = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
/*
|
|
|
|
|
check the UART for more data |
|
|
|
|
returns true if the function should be called again straight away |
|
|
|
|
*/ |
|
|
|
|
//TODO: 可能引发数组越界,先不用这套串口检查
|
|
|
|
|
bool AC_ZR_Serial_API::check_uart(AP_HAL::UARTDriver *_port) |
|
|
|
|
{ |
|
|
|
|
if (_port == nullptr) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
uint16_t crc; |
|
|
|
|
|
|
|
|
|
WITH_SEMAPHORE(sem); |
|
|
|
|
|
|
|
|
|
uint32_t n = _port->available(); |
|
|
|
|
if (n == 0) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// Debug("t:%ld,read:%ld,len:%d",AP_HAL::millis(),n,pktoffset);
|
|
|
|
|
if (pktoffset < bufsize) { // 判断数据是否存满
|
|
|
|
|
ssize_t nread = _port->read(&pktbuf[pktoffset], MIN(n, unsigned(bufsize-pktoffset))); // 限制读取长度,收到的和剩余空间长度取小的值
|
|
|
|
|
serial_last_data_time = AP_HAL::millis(); |
|
|
|
|
if (nread <= 0) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
pktoffset += nread; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint8_t *p = (uint8_t *)memchr(&pktbuf[0], (char)0xFE, pktoffset-1); |
|
|
|
|
if (p) { |
|
|
|
|
uint8_t newlen = pktoffset - (p - pktbuf); |
|
|
|
|
memmove(&pktbuf[0], p, newlen); |
|
|
|
|
pktoffset = newlen; |
|
|
|
|
// Debug("move msg:%d",newlen);
|
|
|
|
|
} else { |
|
|
|
|
// pktoffset = 0;
|
|
|
|
|
goto reset; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (pktbuf[0] != 0xFE) { |
|
|
|
|
// Debug("no head:%d",pktoffset);
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
crc = crc_crc8(pktbuf, CONTROL_DATA_LEN-1); |
|
|
|
|
if (crc == pktbuf[CONTROL_DATA_LEN-1]) { |
|
|
|
|
// got pkt1
|
|
|
|
|
memcpy(flight_control_parser.data,pktbuf,CONTROL_DATA_LEN); // 收到一帧数据
|
|
|
|
|
control_data_last_time = AP_HAL::millis(); |
|
|
|
|
// Debug(" %ld-get msg,ofs:%d ",control_data_last_time,pktoffset);
|
|
|
|
|
// process_packet(pktbuf);
|
|
|
|
|
memmove(&pktbuf[0], &pktbuf[CONTROL_DATA_LEN], pktoffset-CONTROL_DATA_LEN); |
|
|
|
|
pktoffset -= CONTROL_DATA_LEN; |
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
Debug("crc err: %02x ,clc: %02x",pktbuf[CONTROL_DATA_LEN-1],crc); |
|
|
|
|
set_control_ask(pktbuf[3],flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRCRC); // 应答CRC错误
|
|
|
|
|
goto reset; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
reset: |
|
|
|
|
uint8_t *p2 = (uint8_t *)memchr(&pktbuf[1], (char)0xFE, pktoffset-1); |
|
|
|
|
if (p2) { |
|
|
|
|
uint8_t newlen = pktoffset - (p2 - pktbuf); |
|
|
|
|
memmove(&pktbuf[0], p2, newlen); |
|
|
|
|
pktoffset = newlen; |
|
|
|
|
Debug("move msg:%d",newlen); |
|
|
|
|
} else { |
|
|
|
|
pktoffset = 0; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::process_packet(const uint8_t *b) |
|
|
|
|
{ |
|
|
|
|
static uint32_t last_time = 0; |
|
|
|
|
uint8_t crc_sum = 0; |
|
|
|
|
|
|
|
|
|
WITH_SEMAPHORE(sem); |
|
|
|
|
|
|
|
|
|
memcpy(flight_control_parser.data,b,CONTROL_DATA_LEN); |
|
|
|
|
|
|
|
|
|
if(control_data_last_time == last_time){ // 数据没更新,直接退出
|
|
|
|
|
return ; |
|
|
|
|
} |
|
|
|
|
last_time = control_data_last_time; |
|
|
|
|
if(flight_control_parser.msg.head != MSG_HEAD){ // 帧头
|
|
|
|
|
Debug("head error: %02x",flight_control_parser.msg.head ); |
|
|
|
|
return ; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(crc_sum != flight_control_parser.data[CONTROL_DATA_LEN - 1]){ |
|
|
|
|
Debug("crc err: %02x ,clc: %02x",flight_control_parser.msg.crc,crc_sum); |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRCRC); // 应答CRC错误
|
|
|
|
|
return ; // 校验失败
|
|
|
|
|
} |
|
|
|
|
if(flight_control_parser.msg.type < ZR_Msg_Type::MSG_CONTROL_TKOFF || flight_control_parser.msg.type > ZR_Msg_Type::MSG_CONTROL_VEL ){ |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRTYPE); // 应答控制类型错误
|
|
|
|
|
return ; // 控制类型错误
|
|
|
|
|
} |
|
|
|
|
if(flight_control_parser.msg.type != ZR_Msg_Type::MSG_CONTROL_TKOFF && flight_mode != 4){ |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRMODE);
|
|
|
|
|
return ; // 飞行模式错误
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
control_data.time_stamp = AP_HAL::millis(); |
|
|
|
|
control_data_last_time = AP_HAL::millis(); |
|
|
|
|
control_data.type = flight_control_parser.msg.type; |
|
|
|
|
control_data.data.x = flight_control_parser.msg.x; |
|
|
|
|
control_data.data.y = flight_control_parser.msg.y; |
|
|
|
|
control_data.data.z = flight_control_parser.msg.z; |
|
|
|
|
control_data.yaw_deg = flight_control_parser.msg.yaw; |
|
|
|
|
|
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_OK); // 应答成功
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
void AC_ZR_Serial_API::get_vehicle_NEU_pos(Vector3f vec_neu) |
|
|
|
|
{ |
|
|
|
|
static char buf[50]; |
|
|
|
@ -282,19 +196,25 @@ void AC_ZR_Serial_API::get_vehicle_euler_angles(Vector3f euler)
@@ -282,19 +196,25 @@ void AC_ZR_Serial_API::get_vehicle_euler_angles(Vector3f euler)
|
|
|
|
|
write_data_to_port(_zr_api_port,(const uint8_t *)buf, mav_data_len); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// TODO: 飞行模式调整成自定义
|
|
|
|
|
|
|
|
|
|
void AC_ZR_Serial_API::get_vehicle_status(uint8_t mode,uint8_t in_air,uint32_t home_distance,uint16_t volt_mv,uint8_t bat_remaining) |
|
|
|
|
{ |
|
|
|
|
return; // for test ,don't send
|
|
|
|
|
flight_mode = mode; |
|
|
|
|
|
|
|
|
|
static uint8_t delay_cnt; |
|
|
|
|
uint8_t freq_cnt = 1; |
|
|
|
|
delay_cnt += 1; |
|
|
|
|
if(delay_cnt < 50){ |
|
|
|
|
uint8_t freq = (uint8_t)parm_status_freq; |
|
|
|
|
if(freq == 0){ |
|
|
|
|
return; |
|
|
|
|
}else{ |
|
|
|
|
freq_cnt = 10/freq; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(delay_cnt < freq_cnt){ |
|
|
|
|
return; |
|
|
|
|
}else{ |
|
|
|
|
delay_cnt = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t crc_sum = 0; |
|
|
|
|
|
|
|
|
@ -317,8 +237,16 @@ void AC_ZR_Serial_API::get_vehicle_status(uint8_t mode,uint8_t in_air,uint32_t h
@@ -317,8 +237,16 @@ void AC_ZR_Serial_API::get_vehicle_status(uint8_t mode,uint8_t in_air,uint32_t h
|
|
|
|
|
void AC_ZR_Serial_API::get_vehicle_flight_data(Vector3l pos,Vector3l vel,Vector3f euler) |
|
|
|
|
{ |
|
|
|
|
static uint8_t delay_cnt; |
|
|
|
|
uint8_t freq_cnt = 1; |
|
|
|
|
delay_cnt += 1; |
|
|
|
|
if(delay_cnt < 10){ |
|
|
|
|
uint8_t freq = (uint8_t)parm_data_freq; |
|
|
|
|
if(freq == 0){ |
|
|
|
|
return; |
|
|
|
|
}else{ |
|
|
|
|
freq_cnt = 50/freq; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(delay_cnt < freq_cnt){ |
|
|
|
|
return; |
|
|
|
|
}else{ |
|
|
|
|
delay_cnt = 0; |
|
|
|
@ -369,27 +297,38 @@ bool AC_ZR_Serial_API::get_control_data(uint8_t mode, ZR_Msg_Type &type,Vector3l
@@ -369,27 +297,38 @@ bool AC_ZR_Serial_API::get_control_data(uint8_t mode, ZR_Msg_Type &type,Vector3l
|
|
|
|
|
last_time = control_data_last_time; |
|
|
|
|
WITH_SEMAPHORE(sem); |
|
|
|
|
if(flight_control_parser.msg.head != MSG_HEAD){ // 帧头
|
|
|
|
|
Debug("head error: %02x",flight_control_parser.msg.head ); |
|
|
|
|
if(get_param_debug()){ |
|
|
|
|
Debug("head error: %02x",flight_control_parser.msg.head ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// crc 校验
|
|
|
|
|
crc_sum = crc_crc8(flight_control_parser.data,CONTROL_DATA_LEN-1); |
|
|
|
|
|
|
|
|
|
if(crc_sum != flight_control_parser.data[CONTROL_DATA_LEN - 1]){ |
|
|
|
|
Debug("crc err: %02x ,clc: %02x",flight_control_parser.msg.crc,crc_sum); |
|
|
|
|
// Debug("crc err: %02x ,clc: %02x",flight_control_parser.msg.crc,crc_sum);
|
|
|
|
|
if(get_param_debug()){ |
|
|
|
|
|
|
|
|
|
Debug("crc err: %02x ,clc: %02x",flight_control_parser.msg.crc,crc_sum); |
|
|
|
|
} |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRCRC); // 应答CRC错误
|
|
|
|
|
return false; // 校验失败
|
|
|
|
|
} |
|
|
|
|
type = flight_control_parser.msg.type; |
|
|
|
|
if(type < ZR_Msg_Type::MSG_CONTROL_TKOFF || type > ZR_Msg_Type::MSG_CONTROL_VEL_P ){ |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRTYPE); // 应答控制类型错误
|
|
|
|
|
Debug("type error: %d",(int)flight_control_parser.msg.type); |
|
|
|
|
if(get_param_debug()){ |
|
|
|
|
|
|
|
|
|
Debug("type error: %d",(int)flight_control_parser.msg.type); |
|
|
|
|
} |
|
|
|
|
return false; // 控制类型错误
|
|
|
|
|
} |
|
|
|
|
if(type != ZR_Msg_Type::MSG_CONTROL_TKOFF && mode != 4){ |
|
|
|
|
set_control_ask(flight_control_parser.msg.msg_id,flight_control_parser.msg.type,ZR_Msg_ASK::MSG_ASK_ERRMODE);
|
|
|
|
|
Debug("mode error: %d",mode); |
|
|
|
|
if(get_param_debug()){ |
|
|
|
|
Debug("mode error: %d",mode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; // 飞行模式错误
|
|
|
|
|
} |
|
|
|
@ -449,11 +388,11 @@ void AC_ZR_Serial_API::update(void)
@@ -449,11 +388,11 @@ void AC_ZR_Serial_API::update(void)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace AP { |
|
|
|
|
// namespace AP {
|
|
|
|
|
|
|
|
|
|
AC_ZR_Serial_API *zr_data_trans() |
|
|
|
|
{ |
|
|
|
|
return AC_ZR_Serial_API::get_singleton(); |
|
|
|
|
} |
|
|
|
|
// AC_ZR_Serial_API *zr_data_trans()
|
|
|
|
|
// {
|
|
|
|
|
// return AC_ZR_Serial_API::get_singleton();
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// }
|