123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- #pragma once
- #define LOGGER_MAVLINK_SUPPORT 1
- #if LOGGER_MAVLINK_SUPPORT
- #include <AP_HAL/AP_HAL.h>
- #include "AP_Logger_Backend.h"
- extern const AP_HAL::HAL& hal;
- #define DF_MAVLINK_DISABLE_INTERRUPTS 0
- class AP_Logger_MAVLink : public AP_Logger_Backend
- {
- public:
-
- AP_Logger_MAVLink(AP_Logger &front, LoggerMessageWriter_DFLogStart *writer) :
- AP_Logger_Backend(front, writer),
- _max_blocks_per_send_blocks(8)
- ,_perf_packing(hal.util->perf_alloc(AP_HAL::Util::PC_ELAPSED, "DM_packing"))
- {
- _blockcount = 1024*((uint8_t)_front._params.mav_bufsize) / sizeof(struct dm_block);
-
- }
-
- void Init() override;
-
-
- bool logging_started() const override { return _initialised; }
- void stop_logging() override;
-
- bool _WritePrioritisedBlock(const void *pBuffer, uint16_t size,
- bool is_critical) override;
-
- bool CardInserted(void) const override { return true; }
-
- void EraseAll() override {}
- bool NeedPrep() override { return false; }
- void Prep() override { }
-
- uint16_t find_last_log(void) override { return 0; }
- void get_log_boundaries(uint16_t log_num, uint32_t & start_page, uint32_t & end_page) override {}
- void get_log_info(uint16_t log_num, uint32_t &size, uint32_t &time_utc) override {}
- int16_t get_log_data(uint16_t log_num, uint16_t page, uint32_t offset, uint16_t len, uint8_t *data) override { return 0; }
- uint16_t get_num_logs(void) override { return 0; }
- void push_log_blocks() override;
- void remote_log_block_status_msg(const mavlink_channel_t chan, const mavlink_message_t& msg) override;
- protected:
- bool WritesOK() const override;
- private:
- struct dm_block {
- uint32_t seqno;
- uint8_t buf[MAVLINK_MSG_REMOTE_LOG_DATA_BLOCK_FIELD_DATA_LEN];
- uint32_t last_sent;
- struct dm_block *next;
- };
- bool send_log_block(struct dm_block &block);
- void handle_ack(const mavlink_channel_t chan, const mavlink_message_t &msg, uint32_t seqno);
- void handle_retry(uint32_t block_num);
- void do_resends(uint32_t now);
- void free_all_blocks();
-
- struct dm_block_queue {
- uint32_t sent_count;
- struct dm_block *oldest;
- struct dm_block *youngest;
- };
- typedef struct dm_block_queue dm_block_queue_t ;
- void enqueue_block(dm_block_queue_t &queue, struct dm_block *block);
- bool queue_has_block(dm_block_queue_t &queue, struct dm_block *block);
- struct dm_block *dequeue_seqno(dm_block_queue_t &queue, uint32_t seqno);
- bool free_seqno_from_queue(uint32_t seqno, dm_block_queue_t &queue);
- bool send_log_blocks_from_queue(dm_block_queue_t &queue);
- uint8_t stack_size(struct dm_block *stack);
- uint8_t queue_size(dm_block_queue_t queue);
-
- struct dm_block *_blocks_free;
- dm_block_queue_t _blocks_sent;
- dm_block_queue_t _blocks_pending;
- dm_block_queue_t _blocks_retry;
- struct _stats {
-
- uint32_t resends;
- uint8_t collection_count;
- uint16_t state_free;
- uint8_t state_free_min;
- uint8_t state_free_max;
- uint16_t state_pending;
- uint8_t state_pending_min;
- uint8_t state_pending_max;
- uint16_t state_retry;
- uint8_t state_retry_min;
- uint8_t state_retry_max;
- uint16_t state_sent;
- uint8_t state_sent_min;
- uint8_t state_sent_max;
- } stats;
-
- bool logging_enabled() const override { return true; }
- bool logging_failed() const override;
- mavlink_channel_t _chan;
- uint8_t _target_system_id;
- uint8_t _target_component_id;
-
-
-
-
-
-
-
-
- const uint8_t _max_blocks_per_send_blocks;
-
- uint32_t _next_seq_num;
- uint16_t _latest_block_len;
- uint32_t _last_response_time;
- uint32_t _last_send_time;
- uint8_t _next_block_number_to_resend;
- bool _sending_to_client;
- void Write_logger_MAV(AP_Logger_MAVLink &logger);
- uint32_t bufferspace_available() override;
- uint8_t remaining_space_in_current_block();
-
- uint8_t _blockcount_free;
- uint8_t _blockcount;
- struct dm_block *_blocks;
- struct dm_block *_current_block;
- struct dm_block *next_block();
- void periodic_10Hz(uint32_t now) override;
- void periodic_1Hz() override;
- void periodic_fullrate() override;
-
- void stats_init();
- void stats_reset();
- void stats_collect();
- void stats_log();
- uint32_t _stats_last_collected_time;
- uint32_t _stats_last_logged_time;
- uint8_t mavlink_seq;
-
- uint16_t start_new_log(void) override {
- return 0;
- }
-
- AP_HAL::Util::perf_counter_t _perf_errors;
- AP_HAL::Util::perf_counter_t _perf_packing;
- AP_HAL::Util::perf_counter_t _perf_overruns;
- HAL_Semaphore semaphore;
- };
- #endif
|