mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-16 00:43:34 +08:00
Fixes to log download (#5133)
* Fixes to log download * Fixing indentation
This commit is contained in:
@@ -40,17 +40,18 @@
|
||||
#include <time.h>
|
||||
|
||||
#define MOUNTPOINT PX4_ROOTFSDIR "/fs/microsd"
|
||||
|
||||
|
||||
static const char *kSDRoot = MOUNTPOINT "/";
|
||||
static const char *kLogRoot = MOUNTPOINT "/log";
|
||||
static const char *kLogData = MOUNTPOINT "/logdata.txt";
|
||||
static const char *kTmpData = MOUNTPOINT "/$log$.txt";
|
||||
|
||||
#ifdef __PX4_NUTTX
|
||||
#define PX4LOG_REGULAR_FILE DTYPE_FILE
|
||||
#define PX4LOG_DIRECTORY DTYPE_DIRECTORY
|
||||
#define PX4LOG_REGULAR_FILE DTYPE_FILE
|
||||
#define PX4LOG_DIRECTORY DTYPE_DIRECTORY
|
||||
#else
|
||||
#define PX4LOG_REGULAR_FILE DT_REG
|
||||
#define PX4LOG_DIRECTORY DT_DIR
|
||||
#define PX4LOG_REGULAR_FILE DT_REG
|
||||
#define PX4LOG_DIRECTORY DT_DIR
|
||||
#endif
|
||||
|
||||
//#define MAVLINK_LOG_HANDLER_VERBOSE
|
||||
@@ -77,13 +78,13 @@ stat_file(const char* file, time_t* date = 0, uint32_t* size = 0) {
|
||||
MavlinkLogHandler *
|
||||
MavlinkLogHandler::new_instance(Mavlink *mavlink)
|
||||
{
|
||||
return new MavlinkLogHandler(mavlink);
|
||||
return new MavlinkLogHandler(mavlink);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
MavlinkLogHandler::MavlinkLogHandler(Mavlink *mavlink)
|
||||
: MavlinkStream(mavlink)
|
||||
, _pLogHandlerHelper(0)
|
||||
: MavlinkStream(mavlink)
|
||||
, _pLogHandlerHelper(0)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -112,14 +113,14 @@ MavlinkLogHandler::handle_message(const mavlink_message_t *msg)
|
||||
const char*
|
||||
MavlinkLogHandler::get_name(void) const
|
||||
{
|
||||
return "MAVLINK_LOG_HANDLER";
|
||||
return "MAVLINK_LOG_HANDLER";
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
uint8_t
|
||||
MavlinkLogHandler::get_id(void)
|
||||
{
|
||||
return MAVLINK_MSG_ID_LOG_ENTRY;
|
||||
return MAVLINK_MSG_ID_LOG_ENTRY;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -142,15 +143,17 @@ MavlinkLogHandler::get_size(void)
|
||||
void
|
||||
MavlinkLogHandler::send(const hrt_abstime /*t*/)
|
||||
{
|
||||
//-- Send log entry stream packets until buffer is full
|
||||
while (_pLogHandlerHelper && _pLogHandlerHelper->current_status == LogListHelper::LOG_HANDLER_LISTING && _mavlink->get_free_tx_buf() > get_size()) {
|
||||
_log_send_listing();
|
||||
};
|
||||
//-- An arbitrary count of max log data packets in one go
|
||||
int count = 100;
|
||||
while (_pLogHandlerHelper && _pLogHandlerHelper->current_status == LogListHelper::LOG_HANDLER_SENDING_DATA && _mavlink->get_free_tx_buf() > get_size() && --count) {
|
||||
_log_send_data();
|
||||
};
|
||||
//-- An arbitrary count of max bytes in one go (one of the two below but never both)
|
||||
#define MAX_BYTES_SEND 64 * 1024
|
||||
size_t count = 0;
|
||||
//-- Log Entries
|
||||
while (_pLogHandlerHelper && _pLogHandlerHelper->current_status == LogListHelper::LOG_HANDLER_LISTING && _mavlink->get_free_tx_buf() > get_size() && count < MAX_BYTES_SEND) {
|
||||
count += _log_send_listing();
|
||||
}
|
||||
//-- Log Data
|
||||
while (_pLogHandlerHelper && _pLogHandlerHelper->current_status == LogListHelper::LOG_HANDLER_SENDING_DATA && _mavlink->get_free_tx_buf() > get_size() && count < MAX_BYTES_SEND) {
|
||||
count += _log_send_data();
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -172,16 +175,16 @@ MavlinkLogHandler::_log_request_list(const mavlink_message_t *msg)
|
||||
//-- Prepare new request
|
||||
_pLogHandlerHelper = new LogListHelper;
|
||||
}
|
||||
if (_pLogHandlerHelper->log_count)
|
||||
{
|
||||
//-- Define (and clamp) range
|
||||
if (_pLogHandlerHelper->log_count)
|
||||
{
|
||||
//-- Define (and clamp) range
|
||||
_pLogHandlerHelper->next_entry = request.start < _pLogHandlerHelper->log_count ? request.start : _pLogHandlerHelper->log_count - 1;
|
||||
_pLogHandlerHelper->last_entry = request.end < _pLogHandlerHelper->log_count ? request.end : _pLogHandlerHelper->log_count - 1;
|
||||
}
|
||||
}
|
||||
PX4LOG_WARN("\nMavlinkLogHandler::_log_request_list: start: %u last: %u count: %u\n",
|
||||
_pLogHandlerHelper->next_entry,
|
||||
_pLogHandlerHelper->last_entry,
|
||||
_pLogHandlerHelper->log_count);
|
||||
_pLogHandlerHelper->next_entry,
|
||||
_pLogHandlerHelper->last_entry,
|
||||
_pLogHandlerHelper->log_count);
|
||||
//-- Enable streaming
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_LISTING;
|
||||
}
|
||||
@@ -203,23 +206,23 @@ MavlinkLogHandler::_log_request_data(const mavlink_message_t *msg)
|
||||
return;
|
||||
}
|
||||
//-- If we were sending log entries, stop it
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_IDLE;
|
||||
//-- Init send log dataset
|
||||
_pLogHandlerHelper->current_log_filename[0] = 0;
|
||||
_pLogHandlerHelper->current_log_index = request.id;
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_IDLE;
|
||||
//-- Init send log dataset
|
||||
_pLogHandlerHelper->current_log_filename[0] = 0;
|
||||
_pLogHandlerHelper->current_log_index = request.id;
|
||||
uint32_t time_utc = 0;
|
||||
_pLogHandlerHelper->get_entry(_pLogHandlerHelper->current_log_index, _pLogHandlerHelper->current_log_size, time_utc, _pLogHandlerHelper->current_log_filename);
|
||||
_pLogHandlerHelper->current_log_data_offset = request.ofs;
|
||||
if (_pLogHandlerHelper->current_log_data_offset >= _pLogHandlerHelper->current_log_size) {
|
||||
_pLogHandlerHelper->current_log_data_offset = request.ofs;
|
||||
if (_pLogHandlerHelper->current_log_data_offset >= _pLogHandlerHelper->current_log_size) {
|
||||
_pLogHandlerHelper->current_log_data_remaining = 0;
|
||||
} else {
|
||||
} else {
|
||||
_pLogHandlerHelper->current_log_data_remaining = _pLogHandlerHelper->current_log_size - request.ofs;
|
||||
}
|
||||
if (_pLogHandlerHelper->current_log_data_remaining > request.count) {
|
||||
}
|
||||
if (_pLogHandlerHelper->current_log_data_remaining > request.count) {
|
||||
_pLogHandlerHelper->current_log_data_remaining = request.count;
|
||||
}
|
||||
}
|
||||
//-- Enable streaming
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_SENDING_DATA;
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_SENDING_DATA;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -234,7 +237,29 @@ MavlinkLogHandler::_log_request_erase(const mavlink_message_t* /*msg*/)
|
||||
delete _pLogHandlerHelper;
|
||||
_pLogHandlerHelper = 0;
|
||||
}
|
||||
//-- Delete all logs
|
||||
LogListHelper::delete_all(kLogRoot);
|
||||
//-- Now delete all "msgs_*" from root
|
||||
DIR* dp = opendir(kSDRoot);
|
||||
if (dp) {
|
||||
struct dirent entry, *result = nullptr;
|
||||
while (readdir_r(dp, &entry, &result) == 0) {
|
||||
// no more entries?
|
||||
if (!result) {
|
||||
break;
|
||||
}
|
||||
if (entry.d_type == PX4LOG_REGULAR_FILE) {
|
||||
if(!memcmp(entry.d_name, "msgs_", 5)) {
|
||||
char msg_path[128];
|
||||
snprintf(msg_path, sizeof(msg_path), "%s%s", kSDRoot, entry.d_name);
|
||||
if(unlink(msg_path)) {
|
||||
PX4LOG_WARN("MavlinkLogHandler::_log_request_erase Error deleting %s\n", msg_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir(dp);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -249,55 +274,55 @@ MavlinkLogHandler::_log_request_end(const mavlink_message_t* /*msg*/)
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
void
|
||||
size_t
|
||||
MavlinkLogHandler::_log_send_listing()
|
||||
{
|
||||
mavlink_log_entry_t response;
|
||||
uint32_t size, date;
|
||||
_pLogHandlerHelper->get_entry(_pLogHandlerHelper->next_entry, size, date);
|
||||
response.size = size;
|
||||
response.time_utc = date;
|
||||
response.id = _pLogHandlerHelper->next_entry;
|
||||
response.num_logs = _pLogHandlerHelper->log_count;
|
||||
response.last_log_num = _pLogHandlerHelper->last_entry;
|
||||
response.size = size;
|
||||
response.time_utc = date;
|
||||
response.id = _pLogHandlerHelper->next_entry;
|
||||
response.num_logs = _pLogHandlerHelper->log_count;
|
||||
response.last_log_num = _pLogHandlerHelper->last_entry;
|
||||
mavlink_msg_log_entry_send_struct(_mavlink->get_channel(), &response);
|
||||
//-- If we're done listing, flag it.
|
||||
if (_pLogHandlerHelper->next_entry == _pLogHandlerHelper->last_entry) {
|
||||
//-- If we're done listing, flag it.
|
||||
if (_pLogHandlerHelper->next_entry == _pLogHandlerHelper->last_entry) {
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_IDLE;
|
||||
} else {
|
||||
} else {
|
||||
_pLogHandlerHelper->next_entry++;
|
||||
}
|
||||
}
|
||||
PX4LOG_WARN("MavlinkLogHandler::_log_send_listing id: %u count: %u last: %u size: %u date: %u status: %d\n",
|
||||
response.id,
|
||||
response.num_logs,
|
||||
response.last_log_num,
|
||||
response.size,
|
||||
response.time_utc,
|
||||
_pLogHandlerHelper->current_status);
|
||||
response.id,
|
||||
response.num_logs,
|
||||
response.last_log_num,
|
||||
response.size,
|
||||
response.time_utc,
|
||||
_pLogHandlerHelper->current_status);
|
||||
return sizeof(response);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
void
|
||||
size_t
|
||||
MavlinkLogHandler::_log_send_data()
|
||||
{
|
||||
mavlink_log_data_t response;
|
||||
memset(&response, 0, sizeof(response));
|
||||
uint32_t len = _pLogHandlerHelper->current_log_data_remaining;
|
||||
if (len > sizeof(response.data)) {
|
||||
len = sizeof(response.data);
|
||||
}
|
||||
size_t read_size = _pLogHandlerHelper->get_log_data(len, response.data);
|
||||
if (read_size < sizeof(response.data)) {
|
||||
memset(&response.data[read_size], 0, sizeof(response.data) - read_size);
|
||||
}
|
||||
response.ofs = _pLogHandlerHelper->current_log_data_offset;
|
||||
response.id = _pLogHandlerHelper->current_log_index;
|
||||
response.count = read_size;
|
||||
response.ofs = _pLogHandlerHelper->current_log_data_offset;
|
||||
response.id = _pLogHandlerHelper->current_log_index;
|
||||
response.count = read_size;
|
||||
mavlink_msg_log_data_send_struct(_mavlink->get_channel(), &response);
|
||||
_pLogHandlerHelper->current_log_data_offset += read_size;
|
||||
_pLogHandlerHelper->current_log_data_remaining -= read_size;
|
||||
if (read_size < sizeof(response.data) || _pLogHandlerHelper->current_log_data_remaining == 0) {
|
||||
_pLogHandlerHelper->current_status = LogListHelper::LOG_HANDLER_IDLE;
|
||||
}
|
||||
return sizeof(response);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -358,7 +383,7 @@ LogListHelper::get_entry(int idx, uint32_t& size, uint32_t& date, char* filename
|
||||
size_t
|
||||
LogListHelper::get_log_data(uint8_t len, uint8_t* buffer)
|
||||
{
|
||||
if(!current_log_filename[0])
|
||||
if(!current_log_filename[0])
|
||||
return 0;
|
||||
FILE* f = fopen(current_log_filename, "r");
|
||||
if (!f) {
|
||||
@@ -380,7 +405,7 @@ void
|
||||
LogListHelper::_init()
|
||||
{
|
||||
/*
|
||||
|
||||
|
||||
When this helper is created, it scans the log directory
|
||||
and collects all log files found into one file for easy,
|
||||
subsequent access.
|
||||
@@ -389,14 +414,14 @@ LogListHelper::_init()
|
||||
current_log_filename[0] = 0;
|
||||
// Remove old log data file (if any)
|
||||
unlink(kLogData);
|
||||
// Open log directory
|
||||
// Open log directory
|
||||
DIR *dp = opendir(kLogRoot);
|
||||
if (dp == nullptr) {
|
||||
// No log directory. Nothing to do.
|
||||
return;
|
||||
}
|
||||
// Create work file
|
||||
FILE* f = ::fopen(kTmpData, "w");
|
||||
// Create work file
|
||||
FILE* f = ::fopen(kTmpData, "w");
|
||||
if (!f) {
|
||||
PX4LOG_WARN("MavlinkLogHandler::init Error creating %s\n", kTmpData);
|
||||
closedir(dp);
|
||||
@@ -414,7 +439,7 @@ LogListHelper::_init()
|
||||
time_t tt;
|
||||
char log_path[128];
|
||||
snprintf(log_path, sizeof(log_path), "%s/%s", kLogRoot, entry.d_name);
|
||||
if (_get_session_date(log_path, entry.d_name, tt)) {
|
||||
if (_get_session_date(log_path, entry.d_name, tt)) {
|
||||
_scan_logs(f, log_path, tt);
|
||||
}
|
||||
}
|
||||
@@ -519,8 +544,8 @@ LogListHelper::_get_log_time_size(const char* path, const char* file, time_t& da
|
||||
void
|
||||
LogListHelper::delete_all(const char* dir)
|
||||
{
|
||||
//-- Open log directory
|
||||
DIR *dp = opendir(dir);
|
||||
//-- Open log directory
|
||||
DIR* dp = opendir(dir);
|
||||
if (dp == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -54,11 +54,11 @@ public:
|
||||
|
||||
public:
|
||||
static void delete_all(const char* dir);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
bool get_entry (int idx, uint32_t& size, uint32_t& date, char* filename = 0);
|
||||
size_t get_log_data (uint8_t len, uint8_t* buffer);
|
||||
bool get_entry (int idx, uint32_t& size, uint32_t& date, char* filename = 0);
|
||||
size_t get_log_data (uint8_t len, uint8_t* buffer);
|
||||
|
||||
enum {
|
||||
LOG_HANDLER_IDLE,
|
||||
@@ -66,22 +66,22 @@ public:
|
||||
LOG_HANDLER_SENDING_DATA
|
||||
};
|
||||
|
||||
int next_entry;
|
||||
int last_entry;
|
||||
int log_count;
|
||||
int next_entry;
|
||||
int last_entry;
|
||||
int log_count;
|
||||
|
||||
int current_status;
|
||||
uint16_t current_log_index;
|
||||
uint32_t current_log_size;
|
||||
uint32_t current_log_data_offset;
|
||||
uint32_t current_log_data_remaining;
|
||||
char current_log_filename[128];
|
||||
int current_status;
|
||||
uint16_t current_log_index;
|
||||
uint32_t current_log_size;
|
||||
uint32_t current_log_data_offset;
|
||||
uint32_t current_log_data_remaining;
|
||||
char current_log_filename[128];
|
||||
|
||||
private:
|
||||
void _init ();
|
||||
bool _get_session_date (const char* path, const char* dir, time_t& date);
|
||||
void _scan_logs (FILE* f, const char* dir, time_t& date);
|
||||
bool _get_log_time_size (const char* path, const char* file, time_t& date, uint32_t& size);
|
||||
void _init ();
|
||||
bool _get_session_date (const char* path, const char* dir, time_t& date);
|
||||
void _scan_logs (FILE* f, const char* dir, time_t& date);
|
||||
bool _get_log_time_size (const char* path, const char* file, time_t& date, uint32_t& size);
|
||||
};
|
||||
|
||||
// MAVLink LOG_* Message Handler
|
||||
@@ -93,24 +93,25 @@ public:
|
||||
static MavlinkLogHandler *new_instance(Mavlink *mavlink);
|
||||
|
||||
// Handle possible LOG message
|
||||
void handle_message (const mavlink_message_t *msg);
|
||||
void handle_message (const mavlink_message_t *msg);
|
||||
|
||||
// Overrides from MavlinkStream
|
||||
const char* get_name (void) const;
|
||||
uint8_t get_id (void);
|
||||
unsigned get_size (void);
|
||||
void send (const hrt_abstime t);
|
||||
const char* get_name (void) const;
|
||||
uint8_t get_id (void);
|
||||
unsigned get_size (void);
|
||||
void send (const hrt_abstime t);
|
||||
|
||||
private:
|
||||
void _log_message (const mavlink_message_t *msg);
|
||||
void _log_request_list (const mavlink_message_t *msg);
|
||||
void _log_request_data (const mavlink_message_t *msg);
|
||||
void _log_request_erase (const mavlink_message_t *msg);
|
||||
void _log_request_end (const mavlink_message_t *msg);
|
||||
void _log_send_listing ();
|
||||
void _log_send_data ();
|
||||
void _log_message (const mavlink_message_t *msg);
|
||||
void _log_request_list (const mavlink_message_t *msg);
|
||||
void _log_request_data (const mavlink_message_t *msg);
|
||||
void _log_request_erase (const mavlink_message_t *msg);
|
||||
void _log_request_end (const mavlink_message_t *msg);
|
||||
|
||||
size_t _log_send_listing();
|
||||
size_t _log_send_data ();
|
||||
|
||||
private:
|
||||
LogListHelper *_pLogHandlerHelper;
|
||||
LogListHelper *_pLogHandlerHelper;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user