diff --git a/src/lib/drivers/accelerometer/PX4Accelerometer.cpp b/src/lib/drivers/accelerometer/PX4Accelerometer.cpp index e63d48ce88..b4ff95977e 100644 --- a/src/lib/drivers/accelerometer/PX4Accelerometer.cpp +++ b/src/lib/drivers/accelerometer/PX4Accelerometer.cpp @@ -113,10 +113,11 @@ void PX4Accelerometer::update(const hrt_abstime ×tamp_sample, float x, floa // Apply rotation (before scaling) rotate_3f(_rotation, x, y, z); - // publish sensor_accel_s report; - report.timestamp_sample = timestamp_sample; + // ensure monotonically increasing timestamp_sample within reasonable range + report.timestamp_sample = math::constrain(timestamp_sample, _timestamp_prev, hrt_absolute_time()); + report.device_id = _device_id; report.temperature = _temperature; report.error_count = _error_count; @@ -130,10 +131,15 @@ void PX4Accelerometer::update(const hrt_abstime ×tamp_sample, float x, floa report.timestamp = hrt_absolute_time(); _sensor_pub.publish(report); + + _timestamp_prev = report.timestamp; } void PX4Accelerometer::updateFIFO(sensor_accel_fifo_s &sample) { + // ensure monotonically increasing timestamp_sample within reasonable range + sample.timestamp_sample = math::constrain(sample.timestamp_sample, _timestamp_prev, hrt_absolute_time()); + // rotate all raw samples and publish fifo const uint8_t N = sample.samples; @@ -146,6 +152,8 @@ void PX4Accelerometer::updateFIFO(sensor_accel_fifo_s &sample) sample.timestamp = hrt_absolute_time(); _sensor_fifo_pub.publish(sample); + _timestamp_prev = sample.timestamp; + // publish sensor_accel_s report; diff --git a/src/lib/drivers/accelerometer/PX4Accelerometer.hpp b/src/lib/drivers/accelerometer/PX4Accelerometer.hpp index 1e4885ccf7..3f8f8ee7ac 100644 --- a/src/lib/drivers/accelerometer/PX4Accelerometer.hpp +++ b/src/lib/drivers/accelerometer/PX4Accelerometer.hpp @@ -70,6 +70,8 @@ private: uORB::PublicationMulti _sensor_pub{ORB_ID(sensor_accel)}; uORB::PublicationMulti _sensor_fifo_pub{ORB_ID(sensor_accel_fifo)}; + hrt_abstime _timestamp_prev{0}; + uint32_t _device_id{0}; const enum Rotation _rotation; diff --git a/src/lib/drivers/gyroscope/PX4Gyroscope.cpp b/src/lib/drivers/gyroscope/PX4Gyroscope.cpp index 432a8cb98d..416df19df2 100644 --- a/src/lib/drivers/gyroscope/PX4Gyroscope.cpp +++ b/src/lib/drivers/gyroscope/PX4Gyroscope.cpp @@ -100,7 +100,9 @@ void PX4Gyroscope::update(const hrt_abstime ×tamp_sample, float x, float y, sensor_gyro_s report; - report.timestamp_sample = timestamp_sample; + // ensure monotonically increasing timestamp_sample within reasonable range + report.timestamp_sample = math::constrain(timestamp_sample, _timestamp_prev, hrt_absolute_time()); + report.device_id = _device_id; report.temperature = _temperature; report.error_count = _error_count; @@ -111,10 +113,15 @@ void PX4Gyroscope::update(const hrt_abstime ×tamp_sample, float x, float y, report.timestamp = hrt_absolute_time(); _sensor_pub.publish(report); + + _timestamp_prev = report.timestamp; } void PX4Gyroscope::updateFIFO(sensor_gyro_fifo_s &sample) { + // ensure monotonically increasing timestamp_sample within reasonable range + sample.timestamp_sample = math::constrain(sample.timestamp_sample, _timestamp_prev, hrt_absolute_time()); + // rotate all raw samples and publish fifo const uint8_t N = sample.samples; @@ -127,6 +134,8 @@ void PX4Gyroscope::updateFIFO(sensor_gyro_fifo_s &sample) sample.timestamp = hrt_absolute_time(); _sensor_fifo_pub.publish(sample); + _timestamp_prev = sample.timestamp; + // publish sensor_gyro_s report; diff --git a/src/lib/drivers/gyroscope/PX4Gyroscope.hpp b/src/lib/drivers/gyroscope/PX4Gyroscope.hpp index 8bff5bf5f2..44f19c8d92 100644 --- a/src/lib/drivers/gyroscope/PX4Gyroscope.hpp +++ b/src/lib/drivers/gyroscope/PX4Gyroscope.hpp @@ -1,4 +1,3 @@ - /**************************************************************************** * * Copyright (c) 2018-2021 PX4 Development Team. All rights reserved. @@ -68,6 +67,8 @@ private: uORB::PublicationMulti _sensor_pub{ORB_ID(sensor_gyro)}; uORB::PublicationMulti _sensor_fifo_pub{ORB_ID(sensor_gyro_fifo)}; + hrt_abstime _timestamp_prev{0}; + uint32_t _device_id{0}; const enum Rotation _rotation;