Replay: added --logmatch option

match logging rate to input log
This commit is contained in:
Andrew Tridgell 2016-05-05 14:08:52 +10:00
parent 679b43efc9
commit 7abaa75653
4 changed files with 38 additions and 17 deletions

View File

@ -71,7 +71,7 @@ void LR_MsgHandler_ARSP::process_message(uint8_t *msg)
require_field_float(msg, "Temp")); require_field_float(msg, "Temp"));
} }
void LR_MsgHandler_FRAM::process_message(uint8_t *msg) void LR_MsgHandler_NKF1::process_message(uint8_t *msg)
{ {
wait_timestamp_from_msg(msg); wait_timestamp_from_msg(msg);
} }

View File

@ -69,10 +69,10 @@ private:
AP_Airspeed &airspeed; AP_Airspeed &airspeed;
}; };
class LR_MsgHandler_FRAM : public LR_MsgHandler class LR_MsgHandler_NKF1 : public LR_MsgHandler
{ {
public: public:
LR_MsgHandler_FRAM(log_Format &_f, DataFlash_Class &_dataflash, LR_MsgHandler_NKF1(log_Format &_f, DataFlash_Class &_dataflash,
uint64_t &_last_timestamp_usec) : uint64_t &_last_timestamp_usec) :
LR_MsgHandler(_f, _dataflash, _last_timestamp_usec) { }; LR_MsgHandler(_f, _dataflash, _last_timestamp_usec) { };

View File

@ -255,9 +255,9 @@ bool LogReader::handle_log_format_msg(const struct log_Format &f)
msgparser[f.type] = new LR_MsgHandler_ARSP(formats[f.type], dataflash, msgparser[f.type] = new LR_MsgHandler_ARSP(formats[f.type], dataflash,
last_timestamp_usec, last_timestamp_usec,
airspeed); airspeed);
} else if (streq(name, "FRAM")) { } else if (streq(name, "NKF1")) {
msgparser[f.type] = new LR_MsgHandler_FRAM(formats[f.type], dataflash, msgparser[f.type] = new LR_MsgHandler_NKF1(formats[f.type], dataflash,
last_timestamp_usec); last_timestamp_usec);
} else if (streq(name, "CHEK")) { } else if (streq(name, "CHEK")) {
msgparser[f.type] = new LR_MsgHandler_CHEK(formats[f.type], dataflash, msgparser[f.type] = new LR_MsgHandler_CHEK(formats[f.type], dataflash,
last_timestamp_usec, last_timestamp_usec,

View File

@ -263,6 +263,7 @@ private:
float tolerance_vel = 2; float tolerance_vel = 2;
const char **nottypes = NULL; const char **nottypes = NULL;
uint16_t downsample = 0; uint16_t downsample = 0;
bool logmatch = false;
uint32_t output_counter = 0; uint32_t output_counter = 0;
struct { struct {
@ -288,6 +289,7 @@ private:
void usage(void); void usage(void);
void set_user_parameters(void); void set_user_parameters(void);
void read_sensors(const char *type); void read_sensors(const char *type);
void write_ekf_logs(void);
void log_check_generate(); void log_check_generate();
void log_check_solution(); void log_check_solution();
bool show_error(const char *text, float max_error, float tolerance); bool show_error(const char *text, float max_error, float tolerance);
@ -313,6 +315,7 @@ void Replay::usage(void)
::printf("\t--tolerance-vel tolerance for velocity in meters/second\n"); ::printf("\t--tolerance-vel tolerance for velocity in meters/second\n");
::printf("\t--nottypes list of msg types not to output, comma separated\n"); ::printf("\t--nottypes list of msg types not to output, comma separated\n");
::printf("\t--downsample downsampling rate for output\n"); ::printf("\t--downsample downsampling rate for output\n");
::printf("\t--logmatch match logging rate to source\n");
} }
@ -323,7 +326,8 @@ enum {
OPT_TOLERANCE_POS, OPT_TOLERANCE_POS,
OPT_TOLERANCE_VEL, OPT_TOLERANCE_VEL,
OPT_NOTTYPES, OPT_NOTTYPES,
OPT_DOWNSAMPLE OPT_DOWNSAMPLE,
OPT_LOGMATCH
}; };
void Replay::flush_dataflash(void) { void Replay::flush_dataflash(void) {
@ -375,6 +379,7 @@ void Replay::_parse_command_line(uint8_t argc, char * const argv[])
{"tolerance-vel", true, 0, OPT_TOLERANCE_VEL}, {"tolerance-vel", true, 0, OPT_TOLERANCE_VEL},
{"nottypes", true, 0, OPT_NOTTYPES}, {"nottypes", true, 0, OPT_NOTTYPES},
{"downsample", true, 0, OPT_DOWNSAMPLE}, {"downsample", true, 0, OPT_DOWNSAMPLE},
{"logmatch", false, 0, OPT_LOGMATCH},
{0, false, 0, 0} {0, false, 0, 0}
}; };
@ -445,6 +450,10 @@ void Replay::_parse_command_line(uint8_t argc, char * const argv[])
downsample = atoi(gopt.optarg); downsample = atoi(gopt.optarg);
break; break;
case OPT_LOGMATCH:
logmatch = true;
break;
case 'h': case 'h':
default: default:
usage(); usage();
@ -694,6 +703,22 @@ void Replay::set_user_parameters(void)
} }
} }
/*
write out EKF log messages
*/
void Replay::write_ekf_logs(void)
{
if (!LogReader::in_list("EKF", nottypes)) {
_vehicle.dataflash.Log_Write_EKF(_vehicle.ahrs,false);
}
if (!LogReader::in_list("AHRS2", nottypes)) {
_vehicle.dataflash.Log_Write_AHRS2(_vehicle.ahrs);
}
if (!LogReader::in_list("POS", nottypes)) {
_vehicle.dataflash.Log_Write_POS(_vehicle.ahrs);
}
}
void Replay::read_sensors(const char *type) void Replay::read_sensors(const char *type)
{ {
if (!done_parameters && !streq(type,"FMT") && !streq(type,"PARM")) { if (!done_parameters && !streq(type,"FMT") && !streq(type,"PARM")) {
@ -763,16 +788,8 @@ void Replay::read_sensors(const char *type)
if (_vehicle.ahrs.get_home().lat != 0) { if (_vehicle.ahrs.get_home().lat != 0) {
_vehicle.inertial_nav.update(_vehicle.ins.get_delta_time()); _vehicle.inertial_nav.update(_vehicle.ins.get_delta_time());
} }
if (downsample == 0 || ++output_counter % downsample == 0) { if ((downsample == 0 || ++output_counter % downsample == 0) && !logmatch) {
if (!LogReader::in_list("EKF", nottypes)) { write_ekf_logs();
_vehicle.dataflash.Log_Write_EKF(_vehicle.ahrs,false);
}
if (!LogReader::in_list("AHRS2", nottypes)) {
_vehicle.dataflash.Log_Write_AHRS2(_vehicle.ahrs);
}
if (!LogReader::in_list("POS", nottypes)) {
_vehicle.dataflash.Log_Write_POS(_vehicle.ahrs);
}
} }
if (_vehicle.ahrs.healthy() != ahrs_healthy) { if (_vehicle.ahrs.healthy() != ahrs_healthy) {
ahrs_healthy = _vehicle.ahrs.healthy(); ahrs_healthy = _vehicle.ahrs.healthy();
@ -786,6 +803,10 @@ void Replay::read_sensors(const char *type)
log_check_solution(); log_check_solution();
} }
} }
if (logmatch && streq(type, "NKF1")) {
write_ekf_logs();
}
} }