mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-24 06:13:33 +08:00
Merge branch 'master' of github.com:PX4/Firmware into gps_logging_dual
This commit is contained in:
@@ -119,7 +119,7 @@ int ardrone_interface_main(int argc, char *argv[])
|
|||||||
ardrone_interface_task = task_spawn_cmd("ardrone_interface",
|
ardrone_interface_task = task_spawn_cmd("ardrone_interface",
|
||||||
SCHED_DEFAULT,
|
SCHED_DEFAULT,
|
||||||
SCHED_PRIORITY_MAX - 15,
|
SCHED_PRIORITY_MAX - 15,
|
||||||
2048,
|
1100,
|
||||||
ardrone_interface_thread_main,
|
ardrone_interface_thread_main,
|
||||||
(argv) ? (const char **)&argv[2] : (const char **)NULL);
|
(argv) ? (const char **)&argv[2] : (const char **)NULL);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|||||||
@@ -38,3 +38,4 @@
|
|||||||
MODULE_COMMAND = ardrone_interface
|
MODULE_COMMAND = ardrone_interface
|
||||||
SRCS = ardrone_interface.c \
|
SRCS = ardrone_interface.c \
|
||||||
ardrone_motor_control.c
|
ardrone_motor_control.c
|
||||||
|
MODULE_STACKSIZE = 1200
|
||||||
|
|||||||
@@ -1380,7 +1380,6 @@ MPU6000_gyro::init()
|
|||||||
|
|
||||||
_gyro_class_instance = register_class_devname(GYRO_DEVICE_PATH);
|
_gyro_class_instance = register_class_devname(GYRO_DEVICE_PATH);
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -753,8 +753,8 @@ MS5611::print_info()
|
|||||||
printf("TEMP: %d\n", _TEMP);
|
printf("TEMP: %d\n", _TEMP);
|
||||||
printf("SENS: %lld\n", _SENS);
|
printf("SENS: %lld\n", _SENS);
|
||||||
printf("OFF: %lld\n", _OFF);
|
printf("OFF: %lld\n", _OFF);
|
||||||
printf("P: %.3f\n", _P);
|
printf("P: %.3f\n", (double)_P);
|
||||||
printf("T: %.3f\n", _T);
|
printf("T: %.3f\n", (double)_T);
|
||||||
printf("MSL pressure: %10.4f\n", (double)(_msl_pressure / 100.f));
|
printf("MSL pressure: %10.4f\n", (double)(_msl_pressure / 100.f));
|
||||||
|
|
||||||
printf("factory_setup %u\n", _prom.factory_setup);
|
printf("factory_setup %u\n", _prom.factory_setup);
|
||||||
|
|||||||
@@ -639,7 +639,7 @@ PX4IO_serial::_do_interrupt()
|
|||||||
if (_rx_dma_status == _dma_status_waiting) {
|
if (_rx_dma_status == _dma_status_waiting) {
|
||||||
|
|
||||||
/* verify that the received packet is complete */
|
/* verify that the received packet is complete */
|
||||||
unsigned length = sizeof(_dma_buffer) - stm32_dmaresidual(_rx_dma);
|
int length = sizeof(_dma_buffer) - stm32_dmaresidual(_rx_dma);
|
||||||
if ((length < 1) || (length < PKT_SIZE(_dma_buffer))) {
|
if ((length < 1) || (length < PKT_SIZE(_dma_buffer))) {
|
||||||
perf_count(_pc_badidle);
|
perf_count(_pc_badidle);
|
||||||
|
|
||||||
|
|||||||
@@ -254,9 +254,6 @@ SF0X::~SF0X()
|
|||||||
int
|
int
|
||||||
SF0X::init()
|
SF0X::init()
|
||||||
{
|
{
|
||||||
int ret = ERROR;
|
|
||||||
unsigned i = 0;
|
|
||||||
|
|
||||||
/* do regular cdev init */
|
/* do regular cdev init */
|
||||||
if (CDev::init() != OK) {
|
if (CDev::init() != OK) {
|
||||||
goto out;
|
goto out;
|
||||||
@@ -594,7 +591,7 @@ SF0X::collect()
|
|||||||
valid = false;
|
valid = false;
|
||||||
|
|
||||||
/* wipe out partially read content from last cycle(s), check for dot */
|
/* wipe out partially read content from last cycle(s), check for dot */
|
||||||
for (int i = 0; i < (lend - 2); i++) {
|
for (unsigned i = 0; i < (lend - 2); i++) {
|
||||||
if (_linebuf[i] == '\n') {
|
if (_linebuf[i] == '\n') {
|
||||||
char buf[sizeof(_linebuf)];
|
char buf[sizeof(_linebuf)];
|
||||||
memcpy(buf, &_linebuf[i+1], (lend + 1) - (i + 1));
|
memcpy(buf, &_linebuf[i+1], (lend + 1) - (i + 1));
|
||||||
@@ -795,7 +792,7 @@ const int ERROR = -1;
|
|||||||
|
|
||||||
SF0X *g_dev;
|
SF0X *g_dev;
|
||||||
|
|
||||||
void start();
|
void start(const char *port);
|
||||||
void stop();
|
void stop();
|
||||||
void test();
|
void test();
|
||||||
void reset();
|
void reset();
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ private:
|
|||||||
|
|
||||||
ADC::ADC(uint32_t channels) :
|
ADC::ADC(uint32_t channels) :
|
||||||
CDev("adc", ADC_DEVICE_PATH),
|
CDev("adc", ADC_DEVICE_PATH),
|
||||||
_sample_perf(perf_alloc(PC_ELAPSED, "ADC samples")),
|
_sample_perf(perf_alloc(PC_ELAPSED, "adc_samples")),
|
||||||
_channel_count(0),
|
_channel_count(0),
|
||||||
_samples(nullptr),
|
_samples(nullptr),
|
||||||
_to_system_power(0)
|
_to_system_power(0)
|
||||||
|
|||||||
@@ -266,7 +266,6 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
orb_advert_t pub_att = orb_advertise(ORB_ID(vehicle_attitude), &att);
|
orb_advert_t pub_att = orb_advertise(ORB_ID(vehicle_attitude), &att);
|
||||||
|
|
||||||
int loopcounter = 0;
|
int loopcounter = 0;
|
||||||
int printcounter = 0;
|
|
||||||
|
|
||||||
thread_running = true;
|
thread_running = true;
|
||||||
|
|
||||||
@@ -274,9 +273,6 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
// struct debug_key_value_s dbg = { .key = "", .value = 0.0f };
|
// struct debug_key_value_s dbg = { .key = "", .value = 0.0f };
|
||||||
// orb_advert_t pub_dbg = -1;
|
// orb_advert_t pub_dbg = -1;
|
||||||
|
|
||||||
float sensor_update_hz[3] = {0.0f, 0.0f, 0.0f};
|
|
||||||
// XXX write this out to perf regs
|
|
||||||
|
|
||||||
/* keep track of sensor updates */
|
/* keep track of sensor updates */
|
||||||
uint64_t sensor_last_timestamp[3] = {0, 0, 0};
|
uint64_t sensor_last_timestamp[3] = {0, 0, 0};
|
||||||
|
|
||||||
@@ -287,11 +283,9 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
/* initialize parameter handles */
|
/* initialize parameter handles */
|
||||||
parameters_init(&ekf_param_handles);
|
parameters_init(&ekf_param_handles);
|
||||||
|
|
||||||
uint64_t start_time = hrt_absolute_time();
|
|
||||||
bool initialized = false;
|
bool initialized = false;
|
||||||
|
|
||||||
float gyro_offsets[3] = { 0.0f, 0.0f, 0.0f };
|
float gyro_offsets[3] = { 0.0f, 0.0f, 0.0f };
|
||||||
unsigned offset_count = 0;
|
|
||||||
|
|
||||||
/* rotation matrix for magnetic declination */
|
/* rotation matrix for magnetic declination */
|
||||||
math::Matrix<3, 3> R_decl;
|
math::Matrix<3, 3> R_decl;
|
||||||
@@ -382,7 +376,7 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
/* Fill in gyro measurements */
|
/* Fill in gyro measurements */
|
||||||
if (sensor_last_timestamp[0] != raw.timestamp) {
|
if (sensor_last_timestamp[0] != raw.timestamp) {
|
||||||
update_vect[0] = 1;
|
update_vect[0] = 1;
|
||||||
sensor_update_hz[0] = 1e6f / (raw.timestamp - sensor_last_timestamp[0]);
|
// sensor_update_hz[0] = 1e6f / (raw.timestamp - sensor_last_timestamp[0]);
|
||||||
sensor_last_timestamp[0] = raw.timestamp;
|
sensor_last_timestamp[0] = raw.timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,7 +387,7 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
/* update accelerometer measurements */
|
/* update accelerometer measurements */
|
||||||
if (sensor_last_timestamp[1] != raw.accelerometer_timestamp) {
|
if (sensor_last_timestamp[1] != raw.accelerometer_timestamp) {
|
||||||
update_vect[1] = 1;
|
update_vect[1] = 1;
|
||||||
sensor_update_hz[1] = 1e6f / (raw.timestamp - sensor_last_timestamp[1]);
|
// sensor_update_hz[1] = 1e6f / (raw.timestamp - sensor_last_timestamp[1]);
|
||||||
sensor_last_timestamp[1] = raw.accelerometer_timestamp;
|
sensor_last_timestamp[1] = raw.accelerometer_timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,7 +439,7 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
/* update magnetometer measurements */
|
/* update magnetometer measurements */
|
||||||
if (sensor_last_timestamp[2] != raw.magnetometer_timestamp) {
|
if (sensor_last_timestamp[2] != raw.magnetometer_timestamp) {
|
||||||
update_vect[2] = 1;
|
update_vect[2] = 1;
|
||||||
sensor_update_hz[2] = 1e6f / (raw.timestamp - sensor_last_timestamp[2]);
|
// sensor_update_hz[2] = 1e6f / (raw.timestamp - sensor_last_timestamp[2]);
|
||||||
sensor_last_timestamp[2] = raw.magnetometer_timestamp;
|
sensor_last_timestamp[2] = raw.magnetometer_timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,8 +492,6 @@ const unsigned int loop_interval_alarm = 6500; // loop interval in microseconds
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t timing_start = hrt_absolute_time();
|
|
||||||
|
|
||||||
attitudeKalmanfilter(update_vect, dt, z_k, x_aposteriori_k, P_aposteriori_k, ekf_params.q, ekf_params.r,
|
attitudeKalmanfilter(update_vect, dt, z_k, x_aposteriori_k, P_aposteriori_k, ekf_params.q, ekf_params.r,
|
||||||
euler, Rot_matrix, x_aposteriori, P_aposteriori);
|
euler, Rot_matrix, x_aposteriori, P_aposteriori);
|
||||||
|
|
||||||
|
|||||||
@@ -1067,7 +1067,7 @@ FixedwingEstimator::task_main()
|
|||||||
mavlink_log_info(_mavlink_fd, "[ekf] ref: LA %.4f,LO %.4f,ALT %.2f", lat, lon, (double)gps_alt);
|
mavlink_log_info(_mavlink_fd, "[ekf] ref: LA %.4f,LO %.4f,ALT %.2f", lat, lon, (double)gps_alt);
|
||||||
warnx("HOME/REF: LA %8.4f,LO %8.4f,ALT %8.2f V: %8.4f %8.4f %8.4f", lat, lon, (double)gps_alt,
|
warnx("HOME/REF: LA %8.4f,LO %8.4f,ALT %8.2f V: %8.4f %8.4f %8.4f", lat, lon, (double)gps_alt,
|
||||||
(double)_ekf->velNED[0], (double)_ekf->velNED[1], (double)_ekf->velNED[2]);
|
(double)_ekf->velNED[0], (double)_ekf->velNED[1], (double)_ekf->velNED[2]);
|
||||||
warnx("BARO: %8.4f m / ref: %8.4f m / gps offs: %8.4f m", _ekf->baroHgt, _baro_ref, _baro_gps_offset);
|
warnx("BARO: %8.4f m / ref: %8.4f m / gps offs: %8.4f m", (double)_ekf->baroHgt, (double)_baro_ref, (double)_baro_gps_offset);
|
||||||
warnx("GPS: eph: %8.4f, epv: %8.4f, declination: %8.4f", (double)_gps.eph_m, (double)_gps.epv_m, (double)math::degrees(declination));
|
warnx("GPS: eph: %8.4f, epv: %8.4f, declination: %8.4f", (double)_gps.eph_m, (double)_gps.epv_m, (double)math::degrees(declination));
|
||||||
|
|
||||||
_gps_initialized = true;
|
_gps_initialized = true;
|
||||||
|
|||||||
@@ -304,8 +304,8 @@ FixedwingAttitudeControl::FixedwingAttitudeControl() :
|
|||||||
|
|
||||||
/* publications */
|
/* publications */
|
||||||
_rate_sp_pub(-1),
|
_rate_sp_pub(-1),
|
||||||
_actuators_0_pub(-1),
|
|
||||||
_attitude_sp_pub(-1),
|
_attitude_sp_pub(-1),
|
||||||
|
_actuators_0_pub(-1),
|
||||||
_actuators_1_pub(-1),
|
_actuators_1_pub(-1),
|
||||||
|
|
||||||
/* performance counters */
|
/* performance counters */
|
||||||
@@ -773,7 +773,7 @@ FixedwingAttitudeControl::task_main()
|
|||||||
_parameters.airspeed_min, _parameters.airspeed_max, airspeed, airspeed_scaling, lock_integrator);
|
_parameters.airspeed_min, _parameters.airspeed_max, airspeed, airspeed_scaling, lock_integrator);
|
||||||
_actuators.control[0] = (isfinite(roll_u)) ? roll_u + _parameters.trim_roll : _parameters.trim_roll;
|
_actuators.control[0] = (isfinite(roll_u)) ? roll_u + _parameters.trim_roll : _parameters.trim_roll;
|
||||||
if (!isfinite(roll_u)) {
|
if (!isfinite(roll_u)) {
|
||||||
warnx("roll_u %.4f", roll_u);
|
warnx("roll_u %.4f", (double)roll_u);
|
||||||
}
|
}
|
||||||
|
|
||||||
float pitch_u = _pitch_ctrl.control_bodyrate(_att.roll, _att.pitch,
|
float pitch_u = _pitch_ctrl.control_bodyrate(_att.roll, _att.pitch,
|
||||||
|
|||||||
@@ -418,8 +418,8 @@ FixedwingPositionControl::FixedwingPositionControl() :
|
|||||||
land_motor_lim(false),
|
land_motor_lim(false),
|
||||||
land_onslope(false),
|
land_onslope(false),
|
||||||
launch_detected(false),
|
launch_detected(false),
|
||||||
last_manual(false),
|
|
||||||
usePreTakeoffThrust(false),
|
usePreTakeoffThrust(false),
|
||||||
|
last_manual(false),
|
||||||
flare_curve_alt_rel_last(0.0f),
|
flare_curve_alt_rel_last(0.0f),
|
||||||
launchDetector(),
|
launchDetector(),
|
||||||
_airspeed_error(0.0f),
|
_airspeed_error(0.0f),
|
||||||
|
|||||||
@@ -149,10 +149,7 @@ mavlink_send_uart_bytes(mavlink_channel_t channel, const uint8_t *ch, int length
|
|||||||
instance = Mavlink::get_instance(6);
|
instance = Mavlink::get_instance(6);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
default:
|
||||||
|
|
||||||
/* no valid instance, bail */
|
|
||||||
if (!instance) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,9 +208,9 @@ mavlink_send_uart_bytes(mavlink_channel_t channel, const uint8_t *ch, int length
|
|||||||
static void usage(void);
|
static void usage(void);
|
||||||
|
|
||||||
Mavlink::Mavlink() :
|
Mavlink::Mavlink() :
|
||||||
next(nullptr),
|
|
||||||
_device_name(DEFAULT_DEVICE_NAME),
|
_device_name(DEFAULT_DEVICE_NAME),
|
||||||
_task_should_exit(false),
|
_task_should_exit(false),
|
||||||
|
next(nullptr),
|
||||||
_mavlink_fd(-1),
|
_mavlink_fd(-1),
|
||||||
_task_running(false),
|
_task_running(false),
|
||||||
_hil_enabled(false),
|
_hil_enabled(false),
|
||||||
@@ -234,7 +231,6 @@ Mavlink::Mavlink() :
|
|||||||
_subscribe_to_stream_rate(0.0f),
|
_subscribe_to_stream_rate(0.0f),
|
||||||
_flow_control_enabled(true),
|
_flow_control_enabled(true),
|
||||||
_message_buffer({}),
|
_message_buffer({}),
|
||||||
|
|
||||||
/* performance counters */
|
/* performance counters */
|
||||||
_loop_perf(perf_alloc(PC_ELAPSED, "mavlink"))
|
_loop_perf(perf_alloc(PC_ELAPSED, "mavlink"))
|
||||||
{
|
{
|
||||||
@@ -2030,14 +2026,14 @@ Mavlink::task_main(int argc, char *argv[])
|
|||||||
if (_subscribe_to_stream != nullptr) {
|
if (_subscribe_to_stream != nullptr) {
|
||||||
if (OK == configure_stream(_subscribe_to_stream, _subscribe_to_stream_rate)) {
|
if (OK == configure_stream(_subscribe_to_stream, _subscribe_to_stream_rate)) {
|
||||||
if (_subscribe_to_stream_rate > 0.0f) {
|
if (_subscribe_to_stream_rate > 0.0f) {
|
||||||
warnx("stream %s on device %s enabled with rate %.1f Hz", _subscribe_to_stream, _device_name, _subscribe_to_stream_rate);
|
warnx("stream %s on device %s enabled with rate %.1f Hz", _subscribe_to_stream, _device_name, (double)_subscribe_to_stream_rate);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
warnx("stream %s on device %s disabled", _subscribe_to_stream, _device_name);
|
warnx("stream %s on device %s disabled", _subscribe_to_stream, _device_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
warnx("stream %s not found", _subscribe_to_stream, _device_name);
|
warnx("stream %s on device %s not found", _subscribe_to_stream, _device_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete _subscribe_to_stream;
|
delete _subscribe_to_stream;
|
||||||
@@ -2243,7 +2239,6 @@ Mavlink::stream(int argc, char *argv[])
|
|||||||
const char *device_name = DEFAULT_DEVICE_NAME;
|
const char *device_name = DEFAULT_DEVICE_NAME;
|
||||||
float rate = -1.0f;
|
float rate = -1.0f;
|
||||||
const char *stream_name = nullptr;
|
const char *stream_name = nullptr;
|
||||||
int ch;
|
|
||||||
|
|
||||||
argc -= 2;
|
argc -= 2;
|
||||||
argv += 2;
|
argv += 2;
|
||||||
@@ -2280,7 +2275,7 @@ Mavlink::stream(int argc, char *argv[])
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!err_flag && rate >= 0.0 && stream_name != nullptr) {
|
if (!err_flag && rate >= 0.0f && stream_name != nullptr) {
|
||||||
Mavlink *inst = get_instance_for_device(device_name);
|
Mavlink *inst = get_instance_for_device(device_name);
|
||||||
|
|
||||||
if (inst != nullptr) {
|
if (inst != nullptr) {
|
||||||
|
|||||||
@@ -221,8 +221,6 @@ private:
|
|||||||
int _mavlink_fd;
|
int _mavlink_fd;
|
||||||
bool _task_running;
|
bool _task_running;
|
||||||
|
|
||||||
perf_counter_t _loop_perf; /**< loop performance counter */
|
|
||||||
|
|
||||||
/* states */
|
/* states */
|
||||||
bool _hil_enabled; /**< Hardware In the Loop mode */
|
bool _hil_enabled; /**< Hardware In the Loop mode */
|
||||||
bool _use_hil_gps; /**< Accept GPS HIL messages (for example from an external motion capturing system to fake indoor gps) */
|
bool _use_hil_gps; /**< Accept GPS HIL messages (for example from an external motion capturing system to fake indoor gps) */
|
||||||
@@ -282,7 +280,7 @@ private:
|
|||||||
|
|
||||||
pthread_mutex_t _message_buffer_mutex;
|
pthread_mutex_t _message_buffer_mutex;
|
||||||
|
|
||||||
|
perf_counter_t _loop_perf; /**< loop performance counter */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send one parameter.
|
* Send one parameter.
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ MavlinkOrbSubscription::~MavlinkOrbSubscription()
|
|||||||
free(_data);
|
free(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
const orb_id_t
|
orb_id_t
|
||||||
MavlinkOrbSubscription::get_topic()
|
MavlinkOrbSubscription::get_topic()
|
||||||
{
|
{
|
||||||
return _topic;
|
return _topic;
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool is_published();
|
bool is_published();
|
||||||
void *get_data();
|
void *get_data();
|
||||||
const orb_id_t get_topic();
|
orb_id_t get_topic();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const orb_id_t _topic; /*< topic metadata */
|
const orb_id_t _topic; /*< topic metadata */
|
||||||
|
|||||||
@@ -932,6 +932,8 @@ void *MavlinkReceiver::start_helper(void *context)
|
|||||||
rcv->receive_thread(NULL);
|
rcv->receive_thread(NULL);
|
||||||
|
|
||||||
delete rcv;
|
delete rcv;
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_t
|
pthread_t
|
||||||
|
|||||||
@@ -81,5 +81,9 @@ MavlinkStream::update(const hrt_abstime t)
|
|||||||
/* interval expired, send message */
|
/* interval expired, send message */
|
||||||
send(t);
|
send(t);
|
||||||
_last_sent = (t / _interval) * _interval;
|
_last_sent = (t / _interval) * _interval;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,9 +63,13 @@ public:
|
|||||||
MavlinkStream *next;
|
MavlinkStream *next;
|
||||||
|
|
||||||
MavlinkStream();
|
MavlinkStream();
|
||||||
~MavlinkStream();
|
virtual ~MavlinkStream();
|
||||||
void set_interval(const unsigned int interval);
|
void set_interval(const unsigned int interval);
|
||||||
void set_channel(mavlink_channel_t channel);
|
void set_channel(mavlink_channel_t channel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 0 if updated / sent, -1 if unchanged
|
||||||
|
*/
|
||||||
int update(const hrt_abstime t);
|
int update(const hrt_abstime t);
|
||||||
virtual MavlinkStream *new_instance() = 0;
|
virtual MavlinkStream *new_instance() = 0;
|
||||||
virtual void subscribe(Mavlink *mavlink) = 0;
|
virtual void subscribe(Mavlink *mavlink) = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user