ardupilot/libraries/DataFlash/DataFlash_Backend.h
Michael du Breuil 3ee675ad42 DataFlash: Log integer version of mission
This is higher precision the casting to float, and better matches the
internal format we actually use. Removed the indicection as it gained us
nothing. Closes #8875
2018-11-24 20:11:46 -08:00

168 lines
5.2 KiB
C++

#pragma once
#include "DataFlash.h"
class DFMessageWriter_DFLogStart;
class DataFlash_Backend
{
public:
FUNCTOR_TYPEDEF(vehicle_startup_message_Log_Writer, void);
DataFlash_Backend(DataFlash_Class &front,
class DFMessageWriter_DFLogStart *writer);
vehicle_startup_message_Log_Writer vehicle_message_writer();
void internal_error();
virtual bool CardInserted(void) const = 0;
// erase handling
virtual void EraseAll() = 0;
virtual bool NeedPrep() = 0;
virtual void Prep() = 0;
/* Write a block of data at current offset */
bool WriteBlock(const void *pBuffer, uint16_t size) {
return WritePrioritisedBlock(pBuffer, size, false);
}
bool WriteCriticalBlock(const void *pBuffer, uint16_t size) {
return WritePrioritisedBlock(pBuffer, size, true);
}
bool WritePrioritisedBlock(const void *pBuffer, uint16_t size, bool is_critical);
// high level interface
virtual uint16_t find_last_log() = 0;
virtual void get_log_boundaries(uint16_t log_num, uint16_t & start_page, uint16_t & end_page) = 0;
virtual void get_log_info(uint16_t log_num, uint32_t &size, uint32_t &time_utc) = 0;
virtual int16_t get_log_data(uint16_t log_num, uint16_t page, uint32_t offset, uint16_t len, uint8_t *data) = 0;
virtual uint16_t get_num_logs() = 0;
virtual bool logging_started(void) const = 0;
virtual void Init() { }
void set_mission(const AP_Mission *mission);
virtual uint32_t bufferspace_available() = 0;
virtual void PrepForArming() { }
virtual uint16_t start_new_log(void) = 0;
/* stop logging - close output files etc etc.
*
* note that this doesn't stop logging from starting up again
* immediately - e.g. DataFlash_MAVLink might get another start
* packet from a client.
*/
virtual void stop_logging(void) = 0;
void Log_Fill_Format(const struct LogStructure *structure, struct log_Format &pkt);
void Log_Fill_Format_Units(const struct LogStructure *s, struct log_Format_Units &pkt);
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL || CONFIG_HAL_BOARD == HAL_BOARD_LINUX
// currently only DataFlash_File support this:
virtual void flush(void) { }
#endif
// for Dataflash_MAVlink
virtual void remote_log_block_status_msg(mavlink_channel_t chan,
mavlink_message_t* msg) { }
// end for Dataflash_MAVlink
virtual void periodic_tasks();
uint8_t num_types() const;
const struct LogStructure *structure(uint8_t structure) const;
uint8_t num_units() const;
const struct UnitStructure *unit(uint8_t unit) const;
uint8_t num_multipliers() const;
const struct MultiplierStructure *multiplier(uint8_t multiplier) const;
void Log_Write_EntireMission(const AP_Mission &mission);
bool Log_Write_Format(const struct LogStructure *structure);
bool Log_Write_Message(const char *message);
bool Log_Write_MessageF(const char *fmt, ...);
bool Log_Write_Mission_Cmd(const AP_Mission &mission,
const AP_Mission::Mission_Command &cmd);
bool Log_Write_Mode(uint8_t mode, uint8_t reason = 0);
bool Log_Write_Parameter(const char *name, float value);
bool Log_Write_Parameter(const AP_Param *ap,
const AP_Param::ParamToken &token,
enum ap_var_type type);
uint32_t num_dropped(void) const {
return _dropped;
}
/*
* Log_Write support
*/
// write a FMT message out (if it hasn't been done already).
// Returns true if the FMT message has ever been written.
bool Log_Write_Emit_FMT(uint8_t msg_type);
// write a log message out to the log of msg_type type, with
// values contained in arg_list:
bool Log_Write(uint8_t msg_type, va_list arg_list, bool is_critical=false);
// these methods are used when reporting system status over mavlink
virtual bool logging_enabled() const = 0;
virtual bool logging_failed() const = 0;
virtual void vehicle_was_disarmed() { };
bool Log_Write_Unit(const struct UnitStructure *s);
bool Log_Write_Multiplier(const struct MultiplierStructure *s);
bool Log_Write_Format_Units(const struct LogStructure *structure);
protected:
DataFlash_Class &_front;
virtual void periodic_10Hz(const uint32_t now);
virtual void periodic_1Hz();
virtual void periodic_fullrate();
bool ShouldLog(bool is_critical);
virtual bool WritesOK() const = 0;
virtual bool StartNewLogOK() const;
/*
read a block
*/
virtual bool WriteBlockCheckStartupMessages();
virtual void WriteMoreStartupMessages();
virtual void push_log_blocks();
DFMessageWriter_DFLogStart *_startup_messagewriter;
bool _writing_startup_messages;
uint8_t _internal_errors;
uint32_t _dropped;
// must be called when a new log is being started:
virtual void start_new_log_reset_variables();
virtual bool _WritePrioritisedBlock(const void *pBuffer, uint16_t size, bool is_critical) = 0;
bool _initialised;
private:
uint32_t _last_periodic_1Hz;
uint32_t _last_periodic_10Hz;
bool have_logged_armed;
void validate_WritePrioritisedBlock(const void *pBuffer, uint16_t size);
};