summaryrefslogtreecommitdiff
path: root/firmware/os/algos/calibration/nano_calibration/nano_calibration.cc
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/os/algos/calibration/nano_calibration/nano_calibration.cc')
-rw-r--r--firmware/os/algos/calibration/nano_calibration/nano_calibration.cc448
1 files changed, 160 insertions, 288 deletions
diff --git a/firmware/os/algos/calibration/nano_calibration/nano_calibration.cc b/firmware/os/algos/calibration/nano_calibration/nano_calibration.cc
index 122af489..024a031d 100644
--- a/firmware/os/algos/calibration/nano_calibration/nano_calibration.cc
+++ b/firmware/os/algos/calibration/nano_calibration/nano_calibration.cc
@@ -25,9 +25,9 @@ namespace nano_calibration {
namespace {
// Common log message sensor-specific identifiers.
-constexpr char kAccelTag[] = {"[NanoSensorCal:ACCEL_MPS2]"};
-constexpr char kGyroTag[] = {"[NanoSensorCal:GYRO_RPS]"};
-constexpr char kMagTag[] = {"[NanoSensorCal:MAG_UT]"};
+char const *kAccelTag = "[ACCEL_MPS2]";
+char const *kGyroTag = "[GYRO_RPS]";
+char const *kMagTag = "[MAG_UT]";
// Defines a plan for limiting log messages so that upon initialization there
// begins a period set by 'duration_of_rapid_messages_min' where log messages
@@ -47,8 +47,6 @@ constexpr LogMessageRegimen kGyroscopeMessagePlan = {
using ::online_calibration::CalibrationDataThreeAxis;
using ::online_calibration::CalibrationTypeFlags;
-using ::online_calibration::SensorData;
-using ::online_calibration::SensorIndex;
using ::online_calibration::SensorType;
// NanoSensorCal logging macros.
@@ -74,190 +72,83 @@ using ::online_calibration::SensorType;
#define NANO_CAL_LOGI(tag, format, ...) \
TECHENG_LOGI("%s " format, tag, ##__VA_ARGS__)
-} // namespace
-
-void NanoSensorCal::Initialize(OnlineCalibrationThreeAxis *accel_cal,
- OnlineCalibrationThreeAxis *gyro_cal,
- OnlineCalibrationThreeAxis *mag_cal) {
- // Loads stored calibration data and initializes the calibration algorithms.
- accel_cal_ = accel_cal;
- if (accel_cal_ != nullptr) {
- if (accel_cal_->get_sensor_type() == SensorType::kAccelerometerMps2) {
- LoadAshCalibration(CHRE_SENSOR_TYPE_ACCELEROMETER, accel_cal_,
- &accel_cal_update_flags_, kAccelTag);
- NANO_CAL_LOGI(kAccelTag,
- "Accelerometer runtime calibration initialized.");
- } else {
- accel_cal_ = nullptr;
- NANO_CAL_LOGE(kAccelTag, "Failed to initialize: wrong sensor type.");
- }
- }
-
- gyro_cal_ = gyro_cal;
- if (gyro_cal_ != nullptr) {
- if (gyro_cal_->get_sensor_type() == SensorType::kGyroscopeRps) {
- LoadAshCalibration(CHRE_SENSOR_TYPE_GYROSCOPE, gyro_cal_,
- &gyro_cal_update_flags_, kGyroTag);
- NANO_CAL_LOGI(kGyroTag, "Gyroscope runtime calibration initialized.");
- } else {
- gyro_cal_ = nullptr;
- NANO_CAL_LOGE(kGyroTag, "Failed to initialize: wrong sensor type.");
- }
- }
-
- mag_cal_ = mag_cal;
- if (mag_cal != nullptr) {
- if (mag_cal->get_sensor_type() == SensorType::kMagnetometerUt) {
- LoadAshCalibration(CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD, mag_cal_,
- &mag_cal_update_flags_, kMagTag);
- NANO_CAL_LOGI(kMagTag, "Magnetometer runtime calibration initialized.");
- } else {
- mag_cal_ = nullptr;
- NANO_CAL_LOGE(kMagTag, "Failed to initialize: wrong sensor type.");
- }
- }
-
- // Resets the initialization timestamp. Set below in HandleSensorSamples.
- initialization_start_time_nanos_ = 0;
-}
-
-void NanoSensorCal::HandleSensorSamples(
- uint16_t event_type, const chreSensorThreeAxisData *event_data) {
- // Converts CHRE Event -> SensorData::SensorType.
- SensorData sample;
- switch (event_type) {
- case CHRE_EVENT_SENSOR_UNCALIBRATED_ACCELEROMETER_DATA:
- sample.type = SensorType::kAccelerometerMps2;
+bool GetCalMetaData(const NanoSensorCal::OnlineCalibrationThreeAxis &online_cal,
+ uint8_t *chre_sensor_type, char const **sensor_tag,
+ uint8_t *sensor_index, uint8_t *calibration_index) {
+ *chre_sensor_type = 0;
+ *sensor_tag = nullptr;
+ *sensor_index = online_cal.get_sensor_index();
+ *calibration_index = online_cal.get_calibration_index();
+
+ switch (online_cal.get_sensor_type()) {
+ case SensorType::kAccelerometerMps2:
+ *chre_sensor_type = CHRE_SENSOR_TYPE_ACCELEROMETER;
+ *sensor_tag = kAccelTag;
break;
- case CHRE_EVENT_SENSOR_UNCALIBRATED_GYROSCOPE_DATA:
- sample.type = SensorType::kGyroscopeRps;
+ case SensorType::kGyroscopeRps:
+ *chre_sensor_type = CHRE_SENSOR_TYPE_GYROSCOPE;
+ *sensor_tag = kGyroTag;
break;
- case CHRE_EVENT_SENSOR_UNCALIBRATED_GEOMAGNETIC_FIELD_DATA:
- sample.type = SensorType::kMagnetometerUt;
+ case SensorType::kMagnetometerUt:
+ *chre_sensor_type = CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD;
+ *sensor_tag = kMagTag;
break;
default:
- // This sensor type is not used.
- NANO_CAL_LOGW("[NanoSensorCal]",
- "Unexpected 3-axis sensor type received.");
- return;
- }
-
- // Sends the sensor payload to the calibration algorithms and checks for
- // calibration updates.
- const auto &header = event_data->header;
- const auto *data = event_data->readings;
- sample.timestamp_nanos = header.baseTimestamp;
- for (size_t i = 0; i < header.readingCount; i++) {
- sample.timestamp_nanos += data[i].timestampDelta;
- memcpy(sample.data, data[i].v, sizeof(sample.data));
- ProcessSample(sample);
- }
-
- // Starts tracking the time after initialization to help rate limit gyro log
- // messaging.
- if (initialization_start_time_nanos_ == 0) {
- initialization_start_time_nanos_ = header.baseTimestamp;
- gyro_notification_time_nanos_ = 0;
+ NANO_CAL_LOGW("[NanoSensorCal]", "Unexpected sensor calibration (%d).",
+ static_cast<int>(online_cal.get_sensor_type()));
+ return false;
}
+ return true;
}
-void NanoSensorCal::HandleTemperatureSamples(
- uint16_t event_type, const chreSensorFloatData *event_data) {
- // Computes the mean of the batched temperature samples and delivers it to the
- // calibration algorithms. Note, the temperature sensor batch size determines
- // its minimum update interval.
- if (event_type == CHRE_EVENT_SENSOR_ACCELEROMETER_TEMPERATURE_DATA &&
- event_data->header.readingCount > 0) {
- const auto header = event_data->header;
- const auto *data = event_data->readings;
-
- SensorData sample;
- sample.type = SensorType::kTemperatureCelsius;
- sample.timestamp_nanos = header.baseTimestamp;
-
- float accum_temperature_celsius = 0.0f;
- for (size_t i = 0; i < header.readingCount; i++) {
- sample.timestamp_nanos += data[i].timestampDelta;
- accum_temperature_celsius += data[i].value;
+} // namespace
+
+void NanoSensorCal::UpdateCalibration(
+ online_calibration::CalibrationTypeFlags new_cal_flags,
+ const OnlineCalibrationThreeAxis &online_cal) {
+ if (new_cal_flags != CalibrationTypeFlags::NONE) {
+ uint8_t chre_sensor_type = 0;
+ char const *sensor_tag = nullptr;
+ uint8_t sensor_index = 0;
+ uint8_t calibration_index = 0;
+ if (GetCalMetaData(online_cal, &chre_sensor_type, &sensor_tag,
+ &sensor_index, &calibration_index)) {
+ NotifyAshCalibration(chre_sensor_type, sensor_index, calibration_index,
+ online_cal.GetSensorCalibration(),
+ online_cal.which_calibration_flags(), sensor_tag);
}
- sample.data[SensorIndex::kSingleAxis] =
- accum_temperature_celsius / header.readingCount;
- ProcessSample(sample);
- } else {
- NANO_CAL_LOGW("[NanoSensorCal]",
- "Unexpected single-axis sensor type received.");
}
}
-void NanoSensorCal::ProcessSample(const SensorData &sample) {
- // Sends a new sensor sample to each active calibration algorithm and sends
- // out notifications for new calibration updates.
- if (accel_cal_ != nullptr) {
- const CalibrationTypeFlags new_cal_flags =
- accel_cal_->SetMeasurement(sample);
- if (new_cal_flags != CalibrationTypeFlags::NONE) {
- accel_cal_update_flags_ |= new_cal_flags;
- NotifyAshCalibration(CHRE_SENSOR_TYPE_ACCELEROMETER,
- accel_cal_->GetSensorCalibration(),
- accel_cal_update_flags_, kAccelTag);
- PrintCalibration(accel_cal_->GetSensorCalibration(),
- accel_cal_update_flags_, kAccelTag);
-
- if (result_callback_ != nullptr) {
- result_callback_->SetCalibrationEvent(sample.timestamp_nanos,
- SensorType::kAccelerometerMps2,
- accel_cal_update_flags_);
- }
- }
+bool NanoSensorCal::NotifyAshCalibration(
+ uint8_t chre_sensor_type, uint8_t sensor_index, uint8_t calibration_index,
+ const CalibrationDataThreeAxis &cal_data, CalibrationTypeFlags flags,
+ char const *sensor_tag) {
+ bool is_log_update_allowed = true;
+ bool send_results_callback = true;
+
+ if (chre_sensor_type == CHRE_SENSOR_TYPE_GYROSCOPE) {
+ // Rate-limits OTC gyro log updates since they can happen frequently with
+ // temperature changes. However, all GyroCal stillness and OTC model
+ // parameter updates will be reported through the results callback.
+ is_log_update_allowed =
+ IsGyroLogUpdateAllowed(cal_data.cal_update_time_nanos);
+
+ send_results_callback =
+ is_log_update_allowed || flags != CalibrationTypeFlags::BIAS;
}
- if (gyro_cal_ != nullptr) {
- const CalibrationTypeFlags new_cal_flags =
- gyro_cal_->SetMeasurement(sample);
- if (new_cal_flags != CalibrationTypeFlags::NONE) {
- gyro_cal_update_flags_ |= new_cal_flags;
- if (NotifyAshCalibration(CHRE_SENSOR_TYPE_GYROSCOPE,
- gyro_cal_->GetSensorCalibration(),
- gyro_cal_update_flags_, kGyroTag)) {
- const bool print_gyro_log =
- HandleGyroLogMessage(sample.timestamp_nanos);
-
- if (result_callback_ != nullptr &&
- (print_gyro_log ||
- gyro_cal_update_flags_ != CalibrationTypeFlags::BIAS)) {
- // Rate-limits OTC gyro telemetry updates since they can happen
- // frequently with temperature change. However, all GyroCal stillness
- // and OTC model parameter updates will be recorded.
- result_callback_->SetCalibrationEvent(sample.timestamp_nanos,
- SensorType::kGyroscopeRps,
- gyro_cal_update_flags_);
- }
- }
- }
+ if (is_log_update_allowed) {
+ PrintCalibration(cal_data, sensor_index, calibration_index, flags,
+ sensor_tag);
}
- if (mag_cal_ != nullptr) {
- const CalibrationTypeFlags new_cal_flags = mag_cal_->SetMeasurement(sample);
- if (new_cal_flags != CalibrationTypeFlags::NONE) {
- mag_cal_update_flags_ |= new_cal_flags;
- NotifyAshCalibration(CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD,
- mag_cal_->GetSensorCalibration(),
- mag_cal_update_flags_, kMagTag);
- PrintCalibration(mag_cal_->GetSensorCalibration(), mag_cal_update_flags_,
- kMagTag);
-
- if (result_callback_ != nullptr) {
- result_callback_->SetCalibrationEvent(sample.timestamp_nanos,
- SensorType::kMagnetometerUt,
- mag_cal_update_flags_);
- }
- }
+ if (result_callback_ != nullptr && send_results_callback) {
+ result_callback_->SetCalibrationEvent(cal_data.cal_update_time_nanos,
+ cal_data.type, sensor_index,
+ calibration_index, flags);
}
-}
-bool NanoSensorCal::NotifyAshCalibration(
- uint8_t chreSensorType, const CalibrationDataThreeAxis &cal_data,
- CalibrationTypeFlags flags, const char *sensor_tag) {
// Updates the sensor offset calibration using the ASH API.
ashCalInfo ash_cal_info;
memset(&ash_cal_info, 0, sizeof(ashCalInfo));
@@ -285,7 +176,8 @@ bool NanoSensorCal::NotifyAshCalibration(
break;
}
- if (!ashSetCalibration(chreSensorType, &ash_cal_info)) {
+ if (!ashSetMultiCalibration(chre_sensor_type, sensor_index, calibration_index,
+ &ash_cal_info)) {
NANO_CAL_LOGE(sensor_tag, "ASH failed to apply calibration update.");
return false;
}
@@ -311,7 +203,8 @@ bool NanoSensorCal::NotifyAshCalibration(
ash_cal_parameters.tempInterceptSource = ASH_CAL_PARAMS_SOURCE_RUNTIME;
}
- if (!ashSaveCalibrationParams(chreSensorType, &ash_cal_parameters)) {
+ if (!ashSaveMultiCalibrationParams(chre_sensor_type, sensor_index,
+ calibration_index, &ash_cal_parameters)) {
NANO_CAL_LOGE(sensor_tag, "ASH failed to write calibration update.");
return false;
}
@@ -319,91 +212,97 @@ bool NanoSensorCal::NotifyAshCalibration(
return true;
}
-bool NanoSensorCal::LoadAshCalibration(uint8_t chreSensorType,
- OnlineCalibrationThreeAxis *online_cal,
- CalibrationTypeFlags *flags,
- const char *sensor_tag) {
- ashCalParams recalled_ash_cal_parameters;
- if (ashLoadCalibrationParams(chreSensorType, ASH_CAL_STORAGE_ASH,
- &recalled_ash_cal_parameters)) {
- // Checks whether a valid set of runtime calibration parameters was received
- // and can be used for initialization.
- if (DetectRuntimeCalibration(chreSensorType, sensor_tag, flags,
- &recalled_ash_cal_parameters)) {
- CalibrationDataThreeAxis cal_data;
- cal_data.type = online_cal->get_sensor_type();
- cal_data.cal_update_time_nanos = chreGetTime();
-
- // Analyzes the calibration flags and sets only the runtime calibration
- // values that were received.
- if (*flags & CalibrationTypeFlags::BIAS) {
- cal_data.offset_temp_celsius =
- recalled_ash_cal_parameters.offsetTempCelsius;
- memcpy(cal_data.offset, recalled_ash_cal_parameters.offset,
- sizeof(cal_data.offset));
- }
-
- if (*flags & CalibrationTypeFlags::OVER_TEMP) {
- memcpy(cal_data.temp_sensitivity,
- recalled_ash_cal_parameters.tempSensitivity,
- sizeof(cal_data.temp_sensitivity));
- memcpy(cal_data.temp_intercept,
- recalled_ash_cal_parameters.tempIntercept,
- sizeof(cal_data.temp_intercept));
- }
-
- // Sets the algorithm's initial calibration data and notifies ASH to apply
- // the recalled calibration data.
- if (online_cal->SetInitialCalibration(cal_data)) {
- return NotifyAshCalibration(chreSensorType,
- online_cal->GetSensorCalibration(), *flags,
- sensor_tag);
- } else {
- NANO_CAL_LOGE(sensor_tag,
- "Calibration data failed to initialize algorithm.");
- }
- }
- } else {
+void NanoSensorCal::LoadAshCalibration(OnlineCalibrationThreeAxis *online_cal) {
+ uint8_t chre_sensor_type = 0;
+ char const *sensor_tag = nullptr;
+ uint8_t sensor_index = 0;
+ uint8_t calibration_index = 0;
+ ashCalParams recalled_ash_cal_parameters = {};
+
+ // Resets the rate limiter for gyro calibration update messages.
+ initial_gyro_cal_time_nanos_ = 0;
+
+ if (!GetCalMetaData(*online_cal, &chre_sensor_type, &sensor_tag,
+ &sensor_index, &calibration_index) ||
+ !ashLoadMultiCalibrationParams(chre_sensor_type, sensor_index,
+ calibration_index,
+ &recalled_ash_cal_parameters)) {
// This is not necessarily an error since there may not be any previously
// stored runtime calibration data to load yet (e.g., first device boot).
NANO_CAL_LOGW(sensor_tag, "ASH did not recall calibration data.");
+ return;
}
- return false;
+ // Checks whether a valid set of runtime calibration parameters was received
+ // and can be used for initialization.
+ online_calibration::CalibrationTypeFlags flags = CalibrationTypeFlags::NONE;
+ if (DetectRuntimeCalibration(chre_sensor_type, sensor_tag, sensor_index,
+ calibration_index, recalled_ash_cal_parameters,
+ flags)) {
+ CalibrationDataThreeAxis cal_data;
+ cal_data.type = online_cal->get_sensor_type();
+ cal_data.cal_update_time_nanos = chreGetTime();
+
+ // Analyzes the calibration flags and sets only the runtime calibration
+ // values that were received.
+ if (flags & CalibrationTypeFlags::BIAS) {
+ cal_data.offset_temp_celsius =
+ recalled_ash_cal_parameters.offsetTempCelsius;
+ memcpy(cal_data.offset, recalled_ash_cal_parameters.offset,
+ sizeof(cal_data.offset));
+ }
+
+ if (flags & CalibrationTypeFlags::OVER_TEMP) {
+ memcpy(cal_data.temp_sensitivity,
+ recalled_ash_cal_parameters.tempSensitivity,
+ sizeof(cal_data.temp_sensitivity));
+ memcpy(cal_data.temp_intercept, recalled_ash_cal_parameters.tempIntercept,
+ sizeof(cal_data.temp_intercept));
+ }
+
+ // Sets the algorithm's initial calibration data and notifies ASH to apply
+ // the recalled calibration data.
+ if (online_cal->SetInitialCalibration(cal_data)) {
+ NotifyAshCalibration(chre_sensor_type, sensor_index, calibration_index,
+ online_cal->GetSensorCalibration(), flags,
+ sensor_tag);
+ } else {
+ NANO_CAL_LOGE(sensor_tag,
+ "Calibration data failed to initialize algorithm.");
+ }
+ }
}
-bool NanoSensorCal::DetectRuntimeCalibration(uint8_t chreSensorType,
- const char *sensor_tag,
- CalibrationTypeFlags *flags,
- ashCalParams *ash_cal_parameters) {
+bool NanoSensorCal::DetectRuntimeCalibration(
+ uint8_t chre_sensor_type, const char *sensor_tag, uint8_t sensor_index,
+ uint8_t calibration_index, const ashCalParams &ash_cal_parameters,
+ CalibrationTypeFlags &flags) {
// Analyzes calibration source flags to determine whether runtime
// calibration values have been loaded and may be used for initialization. A
// valid runtime calibration source will include at least an offset.
- *flags = CalibrationTypeFlags::NONE; // Resets the calibration flags.
+ flags = CalibrationTypeFlags::NONE; // Resets the calibration flags.
// Uses the ASH calibration source flags to set the appropriate
// CalibrationTypeFlags. These will be used to determine which values to copy
// from 'ash_cal_parameters' and provide to the calibration algorithms for
// initialization.
bool runtime_cal_detected = false;
- if (ash_cal_parameters->offsetSource == ASH_CAL_PARAMS_SOURCE_RUNTIME &&
- ash_cal_parameters->offsetTempCelsiusSource ==
+ if (ash_cal_parameters.offsetSource == ASH_CAL_PARAMS_SOURCE_RUNTIME &&
+ ash_cal_parameters.offsetTempCelsiusSource ==
ASH_CAL_PARAMS_SOURCE_RUNTIME) {
runtime_cal_detected = true;
- *flags = CalibrationTypeFlags::BIAS;
+ flags = CalibrationTypeFlags::BIAS;
}
- if (ash_cal_parameters->tempSensitivitySource ==
+ if (ash_cal_parameters.tempSensitivitySource ==
ASH_CAL_PARAMS_SOURCE_RUNTIME &&
- ash_cal_parameters->tempInterceptSource ==
- ASH_CAL_PARAMS_SOURCE_RUNTIME) {
- *flags |= CalibrationTypeFlags::OVER_TEMP;
+ ash_cal_parameters.tempInterceptSource == ASH_CAL_PARAMS_SOURCE_RUNTIME) {
+ flags |= CalibrationTypeFlags::OVER_TEMP;
}
if (runtime_cal_detected) {
// Prints the retrieved runtime calibration data.
- NANO_CAL_LOGI(sensor_tag, "Runtime calibration data detected.");
- PrintAshCalParams(*ash_cal_parameters, sensor_tag);
+ NANO_CAL_LOGD(sensor_tag, "Runtime calibration data detected.");
} else {
// This is a warning (not an error) since the runtime algorithms will
// function correctly with no recalled calibration values. They will
@@ -414,82 +313,55 @@ bool NanoSensorCal::DetectRuntimeCalibration(uint8_t chreSensorType,
return runtime_cal_detected;
}
-// Helper functions for logging calibration information.
-void NanoSensorCal::PrintAshCalParams(const ashCalParams &cal_params,
- const char *sensor_tag) {
- if (cal_params.offsetSource == ASH_CAL_PARAMS_SOURCE_RUNTIME) {
- NANO_CAL_LOGI(sensor_tag,
- "Offset | Temperature [C]: %.6f, %.6f, %.6f | %.2f",
- cal_params.offset[0], cal_params.offset[1],
- cal_params.offset[2], cal_params.offsetTempCelsius);
- }
-
- if (cal_params.tempSensitivitySource == ASH_CAL_PARAMS_SOURCE_RUNTIME) {
- NANO_CAL_LOGI(sensor_tag, "Temp Sensitivity [units/C]: %.6f, %.6f, %.6f",
- cal_params.tempSensitivity[0], cal_params.tempSensitivity[1],
- cal_params.tempSensitivity[2]);
- }
-
- if (cal_params.tempInterceptSource == ASH_CAL_PARAMS_SOURCE_RUNTIME) {
- NANO_CAL_LOGI(sensor_tag, "Temp Intercept [units]: %.6f, %.6f, %.6f",
- cal_params.tempIntercept[0], cal_params.tempIntercept[1],
- cal_params.tempIntercept[2]);
- }
-
- if (cal_params.scaleFactorSource == ASH_CAL_PARAMS_SOURCE_RUNTIME) {
- NANO_CAL_LOGI(sensor_tag, "Scale Factor: %.6f, %.6f, %.6f",
- cal_params.scaleFactor[0], cal_params.scaleFactor[1],
- cal_params.scaleFactor[2]);
- }
-
- if (cal_params.crossAxisSource == ASH_CAL_PARAMS_SOURCE_RUNTIME) {
- NANO_CAL_LOGI(sensor_tag,
- "Cross-Axis in [yx, zx, zy] order: %.6f, %.6f, %.6f",
- cal_params.crossAxis[0], cal_params.crossAxis[1],
- cal_params.crossAxis[2]);
- }
-}
-
void NanoSensorCal::PrintCalibration(const CalibrationDataThreeAxis &cal_data,
+ uint8_t sensor_index,
+ uint8_t calibration_index,
CalibrationTypeFlags flags,
const char *sensor_tag) {
if (flags & CalibrationTypeFlags::BIAS) {
- NANO_CAL_LOGI(sensor_tag,
- "Offset | Temperature [C]: %.6f, %.6f, %.6f | %.2f",
- cal_data.offset[0], cal_data.offset[1], cal_data.offset[2],
- cal_data.offset_temp_celsius);
+ NANO_CAL_LOGI(
+ sensor_tag,
+ "(%d, %d) Offset | Temp [C] | Quality: %.6f, %.6f, %.6f | %.2f | %d",
+ sensor_index, calibration_index, cal_data.offset[0], cal_data.offset[1],
+ cal_data.offset[2], cal_data.offset_temp_celsius,
+ static_cast<int>(cal_data.calibration_quality.level));
}
if (flags & CalibrationTypeFlags::OVER_TEMP) {
- NANO_CAL_LOGI(sensor_tag, "Temp Sensitivity: %.6f, %.6f, %.6f",
- cal_data.temp_sensitivity[0], cal_data.temp_sensitivity[1],
- cal_data.temp_sensitivity[2]);
- NANO_CAL_LOGI(sensor_tag, "Temp Intercept: %.6f, %.6f, %.6f",
- cal_data.temp_intercept[0], cal_data.temp_intercept[1],
- cal_data.temp_intercept[2]);
+ NANO_CAL_LOGI(sensor_tag, "(%d) Temp Sensitivity: %.6f, %.6f, %.6f",
+ sensor_index, cal_data.temp_sensitivity[0],
+ cal_data.temp_sensitivity[1], cal_data.temp_sensitivity[2]);
+ NANO_CAL_LOGI(sensor_tag, "(%d) Temp Intercept: %.6f, %.6f, %.6f",
+ sensor_index, cal_data.temp_intercept[0],
+ cal_data.temp_intercept[1], cal_data.temp_intercept[2]);
}
}
-bool NanoSensorCal::HandleGyroLogMessage(uint64_t timestamp_nanos) {
+bool NanoSensorCal::IsGyroLogUpdateAllowed(uint64_t timestamp_nanos) {
+ if (initial_gyro_cal_time_nanos_ == 0) {
+ initial_gyro_cal_time_nanos_ = timestamp_nanos;
+ gyro_notification_time_nanos_ = timestamp_nanos;
+ return true;
+ }
+
// Limits the log messaging update rate for the gyro calibrations since
// these can occur frequently with rapid temperature changes.
const int64_t next_log_interval_nanos =
(NANO_TIMER_CHECK_T1_GEQUAL_T2_PLUS_DELTA(
- timestamp_nanos, initialization_start_time_nanos_,
+ /*t1=*/timestamp_nanos, /*t2=*/initial_gyro_cal_time_nanos_,
MIN_TO_NANOS(kGyroscopeMessagePlan.duration_of_rapid_messages_min)))
? MIN_TO_NANOS(kGyroscopeMessagePlan.slow_message_interval_min)
: SEC_TO_NANOS(kGyroscopeMessagePlan.rapid_message_interval_sec);
- const bool print_gyro_log = NANO_TIMER_CHECK_T1_GEQUAL_T2_PLUS_DELTA(
- timestamp_nanos, gyro_notification_time_nanos_, next_log_interval_nanos);
+ const bool is_log_update_allowed = NANO_TIMER_CHECK_T1_GEQUAL_T2_PLUS_DELTA(
+ /*t1=*/timestamp_nanos, /*t2=*/gyro_notification_time_nanos_,
+ /*t_delta=*/next_log_interval_nanos);
- if (print_gyro_log) {
+ if (is_log_update_allowed) {
gyro_notification_time_nanos_ = timestamp_nanos;
- PrintCalibration(gyro_cal_->GetSensorCalibration(), gyro_cal_update_flags_,
- kGyroTag);
}
- return print_gyro_log;
+ return is_log_update_allowed;
}
} // namespace nano_calibration