mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 18:47:21 +08:00
mavlink: log handler rewrite for improved efficiency (#23421)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014, 2020 PX4 Development Team. All rights reserved.
|
* Copyright (c) 2014-2024 PX4 Development Team. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -33,76 +33,86 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/// @file mavlink_log_handler.h
|
#include <perf/perf_counter.h>
|
||||||
/// @author px4dev, Gus Grubba <mavlink@grubba.com>
|
|
||||||
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <queue.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <cstdbool>
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
|
|
||||||
#include "mavlink_bridge_header.h"
|
#include "mavlink_bridge_header.h"
|
||||||
|
|
||||||
class Mavlink;
|
class Mavlink;
|
||||||
|
|
||||||
// MAVLink LOG_* Message Handler
|
|
||||||
class MavlinkLogHandler
|
class MavlinkLogHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MavlinkLogHandler(Mavlink &mavlink);
|
MavlinkLogHandler(Mavlink &mavlink);
|
||||||
~MavlinkLogHandler();
|
~MavlinkLogHandler();
|
||||||
|
|
||||||
// Handle possible LOG message
|
void send();
|
||||||
void handle_message(const mavlink_message_t *msg);
|
void handle_message(const mavlink_message_t *msg);
|
||||||
|
|
||||||
/**
|
private:
|
||||||
* Handle sending of messages. Call this regularly at a fixed frequency.
|
struct LogEntry {
|
||||||
* @param t current time
|
uint16_t id{0xffff};
|
||||||
*/
|
uint32_t time_utc{};
|
||||||
void send();
|
uint32_t size_bytes{};
|
||||||
|
FILE *fp{nullptr};
|
||||||
|
char filepath[60];
|
||||||
|
uint32_t offset{};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LogEntryRequest {
|
||||||
|
uint16_t id{0xffff};
|
||||||
|
uint32_t start_offset{};
|
||||||
|
uint32_t byte_count{};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LogListRequest {
|
||||||
|
uint16_t first_id{0};
|
||||||
|
uint16_t last_id{0};
|
||||||
|
uint16_t current_id{0};
|
||||||
|
int file_index{0};
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class LogHandlerState {
|
||||||
|
Idle,
|
||||||
|
Listing,
|
||||||
|
SendingData
|
||||||
|
};
|
||||||
|
|
||||||
|
// mavlink message handlers
|
||||||
|
void handle_log_request_list(const mavlink_message_t *msg);
|
||||||
|
void handle_log_request_data(const mavlink_message_t *msg);
|
||||||
|
void handle_log_request_end(const mavlink_message_t *msg);
|
||||||
|
void handle_log_erase(const mavlink_message_t *msg);
|
||||||
|
|
||||||
|
// state functions
|
||||||
|
void state_idle();
|
||||||
|
void state_listing();
|
||||||
|
void state_sending_data();
|
||||||
|
|
||||||
|
// Log request list
|
||||||
|
bool create_log_list_file();
|
||||||
|
void write_entries_to_file(FILE *f, const char *dir);
|
||||||
|
void send_log_entry(uint32_t size, uint32_t time_utc);
|
||||||
|
|
||||||
|
// Log request data
|
||||||
|
bool log_entry_from_id(uint16_t log_id, LogEntry *entry);
|
||||||
|
|
||||||
|
// Log erase
|
||||||
|
void delete_all_logs(const char *dir);
|
||||||
|
|
||||||
unsigned get_size();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class LogHandlerState {
|
LogHandlerState _state{LogHandlerState::Idle};
|
||||||
Inactive, //There is no active action of log handler
|
|
||||||
Idle, //The log handler is not sending list/data, but list has been sent
|
|
||||||
Listing, //File list is being send
|
|
||||||
SendingData //File Data is being send
|
|
||||||
};
|
|
||||||
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 _reset_list_helper();
|
|
||||||
void _init_list_helper();
|
|
||||||
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);
|
|
||||||
static void _delete_all(const char *dir);
|
|
||||||
bool _get_entry(int idx, uint32_t &size, uint32_t &date, char *filename = 0, int filename_len = 0);
|
|
||||||
bool _open_for_transmit();
|
|
||||||
size_t _get_log_data(uint8_t len, uint8_t *buffer);
|
|
||||||
void _close_and_unlink_files();
|
|
||||||
|
|
||||||
size_t _log_send_listing();
|
|
||||||
size_t _log_send_data();
|
|
||||||
|
|
||||||
LogHandlerState _current_status{LogHandlerState::Inactive};
|
|
||||||
Mavlink &_mavlink;
|
Mavlink &_mavlink;
|
||||||
|
|
||||||
int _next_entry{0};
|
// Log list
|
||||||
int _last_entry{0};
|
LogListRequest _list_request{};
|
||||||
int _log_count{0};
|
int _num_logs{0};
|
||||||
|
bool _logs_listed{false};
|
||||||
|
|
||||||
uint16_t _current_log_index{UINT16_MAX};
|
// Log data
|
||||||
uint32_t _current_log_size{0};
|
LogEntry _current_entry{};
|
||||||
uint32_t _current_log_data_offset{0};
|
LogEntryRequest _entry_request{};
|
||||||
uint32_t _current_log_data_remaining{0};
|
bool _file_send_finished{};
|
||||||
FILE *_current_log_filep{nullptr};
|
|
||||||
char _current_log_filename[128]; //TODO: consider to allocate on runtime
|
perf_counter_t _create_file_elapsed{perf_alloc(PC_ELAPSED, MODULE_NAME": create file")};
|
||||||
|
perf_counter_t _listing_elapsed{perf_alloc(PC_ELAPSED, MODULE_NAME": listing")};
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user