mavlink ulog: advertise ulog_stream topic before subscribing to ulog_stream_ack

This reduces the maximum number of needed file descriptors by 1 when using
ulog streaming.
This commit is contained in:
Beat Küng
2017-08-14 13:23:59 +02:00
parent ba150566c6
commit 9e01842c6a
2 changed files with 33 additions and 24 deletions
@@ -69,6 +69,13 @@ LogWriterMavlink::~LogWriterMavlink()
void LogWriterMavlink::start_log() void LogWriterMavlink::start_log()
{ {
if (_ulog_stream_pub == nullptr) {
memset(&_ulog_stream_data, 0, sizeof(_ulog_stream_data));
// advertise before we subscribe: this is a trick to reduce the number of needed file descriptors
// (the advertise temporarily opens a file descriptor)
_ulog_stream_pub = orb_advertise_queue(ORB_ID(ulog_stream), &_ulog_stream_data, _queue_size);
}
if (_ulog_stream_ack_sub == -1) { if (_ulog_stream_ack_sub == -1) {
_ulog_stream_ack_sub = orb_subscribe(ORB_ID(ulog_stream_ack)); _ulog_stream_ack_sub = orb_subscribe(ORB_ID(ulog_stream_ack));
} }
+26 -24
View File
@@ -143,32 +143,34 @@ int MavlinkULog::handle_update(mavlink_channel_t channel)
while (updated && !ret && _current_num_msgs < _max_num_messages) { while (updated && !ret && _current_num_msgs < _max_num_messages) {
orb_copy(ORB_ID(ulog_stream), _ulog_stream_sub, &_ulog_data); orb_copy(ORB_ID(ulog_stream), _ulog_stream_sub, &_ulog_data);
if (_ulog_data.flags & ulog_stream_s::FLAGS_NEED_ACK) { if (_ulog_data.timestamp > 0) {
_sent_tries = 1; if (_ulog_data.flags & ulog_stream_s::FLAGS_NEED_ACK) {
_last_sent_time = hrt_absolute_time(); _sent_tries = 1;
lock(); _last_sent_time = hrt_absolute_time();
_wait_for_ack_sequence = _ulog_data.sequence; lock();
_ack_received = false; _wait_for_ack_sequence = _ulog_data.sequence;
unlock(); _ack_received = false;
unlock();
mavlink_logging_data_acked_t msg; mavlink_logging_data_acked_t msg;
msg.sequence = _ulog_data.sequence; msg.sequence = _ulog_data.sequence;
msg.length = _ulog_data.length; msg.length = _ulog_data.length;
msg.first_message_offset = _ulog_data.first_message_offset; msg.first_message_offset = _ulog_data.first_message_offset;
msg.target_system = _target_system; msg.target_system = _target_system;
msg.target_component = _target_component; msg.target_component = _target_component;
memcpy(msg.data, _ulog_data.data, sizeof(msg.data)); memcpy(msg.data, _ulog_data.data, sizeof(msg.data));
mavlink_msg_logging_data_acked_send_struct(channel, &msg); mavlink_msg_logging_data_acked_send_struct(channel, &msg);
} else { } else {
mavlink_logging_data_t msg; mavlink_logging_data_t msg;
msg.sequence = _ulog_data.sequence; msg.sequence = _ulog_data.sequence;
msg.length = _ulog_data.length; msg.length = _ulog_data.length;
msg.first_message_offset = _ulog_data.first_message_offset; msg.first_message_offset = _ulog_data.first_message_offset;
msg.target_system = _target_system; msg.target_system = _target_system;
msg.target_component = _target_component; msg.target_component = _target_component;
memcpy(msg.data, _ulog_data.data, sizeof(msg.data)); memcpy(msg.data, _ulog_data.data, sizeof(msg.data));
mavlink_msg_logging_data_send_struct(channel, &msg); mavlink_msg_logging_data_send_struct(channel, &msg);
}
} }
++_current_num_msgs; ++_current_num_msgs;