mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 19:07:45 +08:00
adlog2: added options cleanup, updates rate limit added
This commit is contained in:
+47
-28
@@ -152,14 +152,19 @@ usage(const char *reason)
|
|||||||
if (reason)
|
if (reason)
|
||||||
fprintf(stderr, "%s\n", reason);
|
fprintf(stderr, "%s\n", reason);
|
||||||
|
|
||||||
errx(1, "usage: sdlog2 {start|stop|status} [-s <number of skipped lines>]\n\n");
|
errx(1, "usage: sdlog2 {start|stop|status} [-r <log rate>] -e -a\n"
|
||||||
|
"\t-r\tLog rate in Hz, 0 means unlimited rate\n"
|
||||||
|
"\t-e\tEnable logging by default (if not, can be started by command)\n"
|
||||||
|
"\t-a\tLog only when armed (can be still overriden by command)\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long log_bytes_written = 0;
|
unsigned long log_bytes_written = 0;
|
||||||
uint64_t starttime = 0;
|
uint64_t start_time = 0;
|
||||||
|
|
||||||
/* logging on or off, default to true */
|
/* logging on or off, default to true */
|
||||||
bool logging_enabled = true;
|
bool logging_enabled = false;
|
||||||
|
bool log_when_armed = false;
|
||||||
|
useconds_t poll_delay = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sd log deamon app only briefly exists to start
|
* The sd log deamon app only briefly exists to start
|
||||||
@@ -384,24 +389,26 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
argv += 2;
|
argv += 2;
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "s:r")) != EOF) {
|
while ((ch = getopt(argc, argv, "r:ea")) != EOF) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 's': {
|
case 'r': {
|
||||||
/* log only every n'th (gyro clocked) value */
|
unsigned r = strtoul(optarg, NULL, 10);
|
||||||
unsigned s = strtoul(optarg, NULL, 10);
|
|
||||||
|
|
||||||
if (s < 1 || s > 250) {
|
if (r == 0) {
|
||||||
errx(1, "Wrong skip value of %d, out of range (1..250)\n", s);
|
poll_delay = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
skip_value = s;
|
poll_delay = 1000000 / r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'e':
|
||||||
/* log only on request, disable logging per default */
|
logging_enabled = true;
|
||||||
logging_enabled = false;
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
log_when_armed = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
@@ -619,7 +626,9 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
/* start logbuffer emptying thread */
|
/* start logbuffer emptying thread */
|
||||||
pthread_t logwriter_pthread = sdlog2_logwriter_start(&lb);
|
pthread_t logwriter_pthread = sdlog2_logwriter_start(&lb);
|
||||||
|
|
||||||
starttime = hrt_absolute_time();
|
/* initialize statistics counter */
|
||||||
|
log_bytes_written = 0;
|
||||||
|
start_time = hrt_absolute_time();
|
||||||
|
|
||||||
/* track changes in sensor_combined topic */
|
/* track changes in sensor_combined topic */
|
||||||
uint16_t gyro_counter = 0;
|
uint16_t gyro_counter = 0;
|
||||||
@@ -629,24 +638,23 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
uint16_t differential_pressure_counter = 0;
|
uint16_t differential_pressure_counter = 0;
|
||||||
|
|
||||||
while (!thread_should_exit) {
|
while (!thread_should_exit) {
|
||||||
|
|
||||||
/* poll all topics */
|
|
||||||
int poll_ret = poll(fds, fdsc, poll_timeout);
|
|
||||||
|
|
||||||
/* handle the poll result */
|
|
||||||
if (poll_ret == 0) {
|
|
||||||
/* XXX this means none of our providers is giving us data - might be an error? */
|
|
||||||
} else if (poll_ret < 0) {
|
|
||||||
/* XXX this is seriously bad - should be an emergency */
|
|
||||||
} else {
|
|
||||||
|
|
||||||
int ifds = 0;
|
|
||||||
|
|
||||||
if (!logging_enabled) {
|
if (!logging_enabled) {
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* poll all topics */
|
||||||
|
int poll_ret = poll(fds, fdsc, poll_delay == 0 ? poll_timeout : 0);
|
||||||
|
|
||||||
|
/* handle the poll result */
|
||||||
|
if (poll_ret < 0) {
|
||||||
|
printf("ERROR: Poll error, stop logging\n");
|
||||||
|
thread_should_exit = false;
|
||||||
|
|
||||||
|
} else if (poll_ret > 0) {
|
||||||
|
|
||||||
|
int ifds = 0;
|
||||||
|
|
||||||
pthread_mutex_lock(&logbuffer_mutex);
|
pthread_mutex_lock(&logbuffer_mutex);
|
||||||
|
|
||||||
/* write time stamp message */
|
/* write time stamp message */
|
||||||
@@ -684,26 +692,32 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
orb_copy(ORB_ID(sensor_combined), subs.sensor_sub, &buf.sensor);
|
orb_copy(ORB_ID(sensor_combined), subs.sensor_sub, &buf.sensor);
|
||||||
bool write_IMU = false;
|
bool write_IMU = false;
|
||||||
bool write_SENS = false;
|
bool write_SENS = false;
|
||||||
|
|
||||||
if (buf.sensor.gyro_counter != gyro_counter) {
|
if (buf.sensor.gyro_counter != gyro_counter) {
|
||||||
gyro_counter = buf.sensor.gyro_counter;
|
gyro_counter = buf.sensor.gyro_counter;
|
||||||
write_IMU = true;
|
write_IMU = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf.sensor.accelerometer_counter != accelerometer_counter) {
|
if (buf.sensor.accelerometer_counter != accelerometer_counter) {
|
||||||
accelerometer_counter = buf.sensor.accelerometer_counter;
|
accelerometer_counter = buf.sensor.accelerometer_counter;
|
||||||
write_IMU = true;
|
write_IMU = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf.sensor.magnetometer_counter != magnetometer_counter) {
|
if (buf.sensor.magnetometer_counter != magnetometer_counter) {
|
||||||
magnetometer_counter = buf.sensor.magnetometer_counter;
|
magnetometer_counter = buf.sensor.magnetometer_counter;
|
||||||
write_IMU = true;
|
write_IMU = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf.sensor.baro_counter != baro_counter) {
|
if (buf.sensor.baro_counter != baro_counter) {
|
||||||
baro_counter = buf.sensor.baro_counter;
|
baro_counter = buf.sensor.baro_counter;
|
||||||
write_SENS = true;
|
write_SENS = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf.sensor.differential_pressure_counter != differential_pressure_counter) {
|
if (buf.sensor.differential_pressure_counter != differential_pressure_counter) {
|
||||||
differential_pressure_counter = buf.sensor.differential_pressure_counter;
|
differential_pressure_counter = buf.sensor.differential_pressure_counter;
|
||||||
write_SENS = true;
|
write_SENS = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write_IMU) {
|
if (write_IMU) {
|
||||||
log_msg.msg_type = LOG_IMU_MSG;
|
log_msg.msg_type = LOG_IMU_MSG;
|
||||||
log_msg.body.log_IMU.gyro_x = buf.sensor.gyro_rad_s[0];
|
log_msg.body.log_IMU.gyro_x = buf.sensor.gyro_rad_s[0];
|
||||||
@@ -717,6 +731,7 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
log_msg.body.log_IMU.mag_z = buf.sensor.magnetometer_ga[2];
|
log_msg.body.log_IMU.mag_z = buf.sensor.magnetometer_ga[2];
|
||||||
sdlog2_logbuffer_write(&lb, &log_msg, LOG_PACKET_SIZE(IMU));
|
sdlog2_logbuffer_write(&lb, &log_msg, LOG_PACKET_SIZE(IMU));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write_SENS) {
|
if (write_SENS) {
|
||||||
log_msg.msg_type = LOG_SENS_MSG;
|
log_msg.msg_type = LOG_SENS_MSG;
|
||||||
log_msg.body.log_SENS.baro_pres = buf.sensor.baro_pres_mbar;
|
log_msg.body.log_SENS.baro_pres = buf.sensor.baro_pres_mbar;
|
||||||
@@ -815,6 +830,10 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
/* unlock, now the writer thread may run */
|
/* unlock, now the writer thread may run */
|
||||||
pthread_mutex_unlock(&logbuffer_mutex);
|
pthread_mutex_unlock(&logbuffer_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (poll_delay > 0) {
|
||||||
|
usleep(poll_delay);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
print_sdlog2_status();
|
print_sdlog2_status();
|
||||||
@@ -841,7 +860,7 @@ int sdlog2_thread_main(int argc, char *argv[])
|
|||||||
void print_sdlog2_status()
|
void print_sdlog2_status()
|
||||||
{
|
{
|
||||||
float mebibytes = log_bytes_written / 1024.0f / 1024.0f;
|
float mebibytes = log_bytes_written / 1024.0f / 1024.0f;
|
||||||
float seconds = ((float)(hrt_absolute_time() - starttime)) / 1000000.0f;
|
float seconds = ((float)(hrt_absolute_time() - start_time)) / 1000000.0f;
|
||||||
|
|
||||||
warnx("wrote %4.2f MiB (average %5.3f MiB/s).\n", (double)mebibytes, (double)(mebibytes / seconds));
|
warnx("wrote %4.2f MiB (average %5.3f MiB/s).\n", (double)mebibytes, (double)(mebibytes / seconds));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user