Replay: use a subclasss of DataFlashFileReader to determine log rate

This commit is contained in:
Peter Barker 2015-06-13 10:23:12 +10:00
parent d41b21cd19
commit 7eb588e9ff
1 changed files with 90 additions and 1 deletions

View File

@ -57,6 +57,7 @@
#include <VehicleType.h> #include <VehicleType.h>
#include <getopt.h> // for optind only #include <getopt.h> // for optind only
#include <utility/getopt_cpp.h> #include <utility/getopt_cpp.h>
#include <MsgHandler.h>
#ifndef INT16_MIN #ifndef INT16_MIN
#define INT16_MIN -32768 #define INT16_MIN -32768
@ -64,6 +65,7 @@
#endif #endif
#include "LogReader.h" #include "LogReader.h"
#include "DataFlashFileReader.h"
#define streq(x, y) (!strcmp(x, y)) #define streq(x, y) (!strcmp(x, y))
@ -109,7 +111,7 @@ private:
bool done_parameters; bool done_parameters;
bool done_baro_init; bool done_baro_init;
bool done_home_init; bool done_home_init;
uint16_t update_rate = 50; uint16_t update_rate = 0;
int32_t arm_time_ms = -1; int32_t arm_time_ms = -1;
bool ahrs_healthy; bool ahrs_healthy;
bool have_imu2; bool have_imu2;
@ -259,6 +261,88 @@ void Replay::_parse_command_line(uint8_t argc, char * const argv[])
} }
} }
class IMU2Counter : public DataFlashFileReader {
public:
IMU2Counter() {}
bool handle_log_format_msg(const struct log_Format &f);
bool handle_msg(const struct log_Format &f, uint8_t *msg);
uint64_t last_imu2_timestamp;
private:
MsgHandler *handler;
};
bool IMU2Counter::handle_log_format_msg(const struct log_Format &f) {
if (!strncmp(f.name,"IMU2",4)) {
// an IMU2 message
handler = new MsgHandler(f);
}
return true;
};
bool IMU2Counter::handle_msg(const struct log_Format &f, uint8_t *msg) {
if (strncmp(f.name,"IMU2",4)) {
// not an IMU2 message
return true;
}
if (handler->field_value(msg, "TimeUS", last_imu2_timestamp)) {
// ::printf("Found timestamp %ld\n", last_imu2_timestamp);
} else if (handler->field_value(msg, "TimeMS", last_imu2_timestamp)) {
// ::printf("Found millisecond timestamp %ld\n", last_imu2_timestamp);
last_imu2_timestamp *= 1000;
} else {
::printf("Unable to find timestamp in IMU2 message");
}
return true;
}
int find_update_rate(const char *filename) {
IMU2Counter reader;
if (!reader.open_log(filename)) {
perror(filename);
exit(1);
}
int samplecount = 0;
uint64_t prev = 0;
uint64_t samplesum = 0;
prev = 0;
while (samplecount < 10) {
char type[5];
if (!reader.update(type)) {
break;
}
if (streq(type, "IMU2")) {
if (prev == 0) {
prev = reader.last_imu2_timestamp;
} else {
samplecount++;
samplesum += reader.last_imu2_timestamp - prev;
prev = reader.last_imu2_timestamp;
}
}
}
if (samplecount < 10) {
::printf("Unable to determine log rate - insufficient IMU2 messages?!");
exit(1);
}
float rate = 1000000/int(samplesum/samplecount);
if (abs(rate - 50) < 5) {
return 50;
}
if (abs(rate - 100) < 10) {
return 100;
}
if (abs(rate - 200) < 10) {
return 200;
}
if (abs(rate - 400) < 20) { // I have a log which is 10 off...
return 400;
}
::printf("Unable to determine log rate - %f matches no rate\n", rate);
exit(1);
}
void Replay::setup() void Replay::setup()
{ {
::printf("Starting\n"); ::printf("Starting\n");
@ -271,6 +355,11 @@ void Replay::setup()
_parse_command_line(argc, argv); _parse_command_line(argc, argv);
hal.console->printf("Processing log %s\n", filename); hal.console->printf("Processing log %s\n", filename);
if (update_rate == 0) {
update_rate = find_update_rate(filename);
}
hal.console->printf("Using an update rate of %u Hz\n", update_rate); hal.console->printf("Using an update rate of %u Hz\n", update_rate);
load_parameters(); load_parameters();