mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-26 12:33:34 +08:00
replay: avoid recursion when adding subscriptions
readAndAddSubscription uses nextDataMessage to find the first corresponding data and nextDataMessage calls readAndAddSubscription when it finds a new message definition.
This commit is contained in:
@@ -721,10 +721,6 @@ Replay::nextDataMessage(std::ifstream &file, Subscription &subscription, int msg
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (message_header.msg_type) {
|
switch (message_header.msg_type) {
|
||||||
case (int)ULogMessageType::ADD_LOGGED_MSG:
|
|
||||||
readAndAddSubscription(file, message_header.msg_size);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case (int)ULogMessageType::DATA:
|
case (int)ULogMessageType::DATA:
|
||||||
file.read((char *)&file_msg_id, sizeof(file_msg_id));
|
file.read((char *)&file_msg_id, sizeof(file_msg_id));
|
||||||
|
|
||||||
@@ -751,6 +747,7 @@ Replay::nextDataMessage(std::ifstream &file, Subscription &subscription, int msg
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case (int)ULogMessageType::REMOVE_LOGGED_MSG: //skip these
|
case (int)ULogMessageType::REMOVE_LOGGED_MSG: //skip these
|
||||||
|
case (int)ULogMessageType::ADD_LOGGED_MSG:
|
||||||
case (int)ULogMessageType::PARAMETER:
|
case (int)ULogMessageType::PARAMETER:
|
||||||
case (int)ULogMessageType::DROPOUT:
|
case (int)ULogMessageType::DROPOUT:
|
||||||
case (int)ULogMessageType::INFO:
|
case (int)ULogMessageType::INFO:
|
||||||
@@ -907,19 +904,26 @@ Replay::run()
|
|||||||
ulog_message_header_s message_header;
|
ulog_message_header_s message_header;
|
||||||
replay_file.seekg(_data_section_start);
|
replay_file.seekg(_data_section_start);
|
||||||
|
|
||||||
//we know the next message must be an ADD_LOGGED_MSG
|
while (true) {
|
||||||
ReadAndAndAddSubResult res;
|
//we are in the Definition & Data Section Message Header section
|
||||||
|
|
||||||
do {
|
|
||||||
replay_file.read((char *)&message_header, ULOG_MSG_HEADER_LEN);
|
replay_file.read((char *)&message_header, ULOG_MSG_HEADER_LEN);
|
||||||
res = readAndAddSubscription(replay_file, message_header.msg_size);
|
|
||||||
|
|
||||||
if (res == ReadAndAndAddSubResult::kFailure) {
|
if (!replay_file) {
|
||||||
PX4_ERR("Failed to read subscription");
|
break;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (res != ReadAndAndAddSubResult::kSuccess);
|
if (message_header.msg_type == (int)ULogMessageType::ADD_LOGGED_MSG) {
|
||||||
|
readAndAddSubscription(replay_file, message_header.msg_size);
|
||||||
|
|
||||||
|
} else if (message_header.msg_type == (int)ULogMessageType::DATA) {
|
||||||
|
// End of Definition & Data Section Message Header section
|
||||||
|
break;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Not important for now, skip
|
||||||
|
replay_file.seekg(message_header.msg_size, ios::cur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const uint64_t timestamp_offset = getTimestampOffset();
|
const uint64_t timestamp_offset = getTimestampOffset();
|
||||||
uint32_t nr_published_messages = 0;
|
uint32_t nr_published_messages = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user