drivers/imu/invensense: adjust icm20602/icm20649/icm20948 rescheduling logic

- this handles the case where the driver might be more than one full
transfer cycle behind
This commit is contained in:
Daniel Agar
2021-10-13 15:02:58 -04:00
parent ef4d4c3093
commit 4559230de6
3 changed files with 30 additions and 9 deletions
@@ -277,12 +277,19 @@ void ICM20602::RunImpl()
timestamp_sample -= extra_samples * static_cast<int>(FIFO_SAMPLE_DT);
samples = _fifo_gyro_samples;
ScheduleOnInterval(_fifo_empty_interval_us,
_fifo_empty_interval_us - (extra_samples * FIFO_SAMPLE_DT));
if (_fifo_gyro_samples > extra_samples) {
// reschedule to run when a total of _fifo_gyro_samples should be available in the FIFO
const uint32_t reschedule_delay_us = (_fifo_gyro_samples - extra_samples) * static_cast<int>(FIFO_SAMPLE_DT);
ScheduleOnInterval(_fifo_empty_interval_us, reschedule_delay_us);
} else {
// otherwise reschedule to run immediately
ScheduleOnInterval(_fifo_empty_interval_us);
}
} else if (samples < _fifo_gyro_samples) {
// reschedule next cycle to catch the desired number of samples
ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * FIFO_SAMPLE_DT);
ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * static_cast<int>(FIFO_SAMPLE_DT));
}
}
}
@@ -232,12 +232,19 @@ void ICM20649::RunImpl()
timestamp_sample -= extra_samples * static_cast<int>(FIFO_SAMPLE_DT);
samples = _fifo_gyro_samples;
ScheduleOnInterval(_fifo_empty_interval_us,
_fifo_empty_interval_us - (extra_samples * FIFO_SAMPLE_DT));
if (_fifo_gyro_samples > extra_samples) {
// reschedule to run when a total of _fifo_gyro_samples should be available in the FIFO
const uint32_t reschedule_delay_us = (_fifo_gyro_samples - extra_samples) * static_cast<int>(FIFO_SAMPLE_DT);
ScheduleOnInterval(_fifo_empty_interval_us, reschedule_delay_us);
} else {
// otherwise reschedule to run immediately
ScheduleOnInterval(_fifo_empty_interval_us);
}
} else if (samples < _fifo_gyro_samples) {
// reschedule next cycle to catch the desired number of samples
ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * FIFO_SAMPLE_DT);
ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * static_cast<int>(FIFO_SAMPLE_DT));
}
if (samples == _fifo_gyro_samples) {
@@ -268,12 +268,19 @@ void ICM20948::RunImpl()
timestamp_sample -= extra_samples * static_cast<int>(FIFO_SAMPLE_DT);
samples = _fifo_gyro_samples;
ScheduleOnInterval(_fifo_empty_interval_us,
_fifo_empty_interval_us - (extra_samples * FIFO_SAMPLE_DT));
if (_fifo_gyro_samples > extra_samples) {
// reschedule to run when a total of _fifo_gyro_samples should be available in the FIFO
const uint32_t reschedule_delay_us = (_fifo_gyro_samples - extra_samples) * static_cast<int>(FIFO_SAMPLE_DT);
ScheduleOnInterval(_fifo_empty_interval_us, reschedule_delay_us);
} else {
// otherwise reschedule to run immediately
ScheduleOnInterval(_fifo_empty_interval_us);
}
} else if (samples < _fifo_gyro_samples) {
// reschedule next cycle to catch the desired number of samples
ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * FIFO_SAMPLE_DT);
ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * static_cast<int>(FIFO_SAMPLE_DT));
}
if (samples == _fifo_gyro_samples) {