/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This module provides a containing class (NanoSensorCal) for dynamic runtime * calibration algorithms that affect the following sensors: * - Accelerometer (offset) * - Gyroscope (offset, with over-temperature compensation) * - Magnetometer (offset) * * Sensor Units: * - Accelerometer [meters/sec^2] * - Gyroscope [radian/sec] * - Magnetometer [micro Tesla, uT] * - Temperature [Celsius]. * * NOTE1: Define NANO_SENSOR_CAL_DBG_ENABLED to enable debug messaging. * * NOTE2: This module uses pointers to runtime calibration algorithm objects. * These must be constructed and initialized outside of this class. The owner * bares the burden of managing the lifetime of these objects with respect to * the NanoSensorCal class which depends on these objects and handles their * interaction with the Android ASH/CHRE system. This arrangement makes it * convenient to modify the specific algorithm implementations (i.e., choice of * calibration algorithm, parameter tuning, etc.) at the nanoapp level without * the need to specialize the standard functionality implemented here. */ #ifndef LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_NANO_CALIBRATION_NANO_CALIBRATION_H_ #define LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_NANO_CALIBRATION_NANO_CALIBRATION_H_ #include #include #include #include #include #include "calibration/online_calibration/common_data/calibration_callback.h" #include "calibration/online_calibration/common_data/calibration_data.h" #include "calibration/online_calibration/common_data/online_calibration.h" #include "calibration/online_calibration/common_data/result_callback_interface.h" #include "calibration/online_calibration/common_data/sensor_data.h" #include "common/math/macros.h" namespace nano_calibration { /* * NanoSensorCal is a container class for dynamic runtime calibration sensor * algorithms used by the IMU_Cal CHRE nanoapp. The main purpose of this class * is to transfer sensor data to the sensor calibration algorithms and provide * calibration updates to CHRE using the ASH API. */ class NanoSensorCal { public: // Alias used to reference the three-axis OnlineCalibration baseclass used by // the runtime calibration sensor wrappers. This is for convenience and to // help with code readability. using OnlineCalibrationThreeAxis = online_calibration::OnlineCalibration< online_calibration::CalibrationDataThreeAxis>; NanoSensorCal() = default; // Sets the sensor calibration object pointers and initializes the algorithms // using runtime values recalled using Android Sensor Hub (ASH). A nullptr may // be passed in to disable a particular sensor calibration. void Initialize(OnlineCalibrationThreeAxis *accel_cal, OnlineCalibrationThreeAxis *gyro_cal, OnlineCalibrationThreeAxis *mag_cal); // Sends new sensor samples to the calibration algorithms. void HandleSensorSamples(uint16_t event_type, const chreSensorThreeAxisData *event_data); // Provides temperature updates to the calibration algorithms. void HandleTemperatureSamples(uint16_t event_type, const chreSensorFloatData *event_data); void set_result_callback( online_calibration::ResultCallbackInterface *result_callback) { result_callback_ = result_callback; } private: // Passes sensor data to the runtime calibration algorithms. void ProcessSample(const online_calibration::SensorData &sample); // Loads runtime calibration data using the Android Sensor Hub API. Returns // 'true' when runtime calibration values were successfully recalled and used // for algorithm initialization. 'sensor_tag' is a string that identifies a // sensor-specific identifier for log messages. Updates 'flags' to indicate // which runtime calibration parameters were recalled. bool LoadAshCalibration(uint8_t chreSensorType, OnlineCalibrationThreeAxis *online_cal, online_calibration::CalibrationTypeFlags *flags, const char *sensor_tag); // Provides sensor calibration updates using the ASH API for the specified // sensor type. 'cal_data' contains the new calibration data. 'flags' is used // to indicate all of the valid calibration values that should be provided // with the update. Returns 'true' with a successful ASH update. bool NotifyAshCalibration( uint8_t chreSensorType, const online_calibration::CalibrationDataThreeAxis &cal_data, online_calibration::CalibrationTypeFlags flags, const char *sensor_tag); // Checks whether 'ash_cal_parameters' is a valid set of runtime calibration // data and can be used for algorithm initialization. Updates 'flags' to // indicate which runtime calibration parameters were detected. bool DetectRuntimeCalibration(uint8_t chreSensorType, const char *sensor_tag, online_calibration::CalibrationTypeFlags *flags, ashCalParams *ash_cal_parameters); // Helper functions for logging calibration information. void PrintAshCalParams(const ashCalParams &cal_params, const char *sensor_tag); void PrintCalibration( const online_calibration::CalibrationDataThreeAxis &cal_data, online_calibration::CalibrationTypeFlags flags, const char *sensor_tag); bool HandleGyroLogMessage(uint64_t timestamp_nanos); // Pointer to the accelerometer runtime calibration object. OnlineCalibrationThreeAxis *accel_cal_ = nullptr; // Pointer to the gyroscope runtime calibration object. OnlineCalibrationThreeAxis *gyro_cal_ = nullptr; // Limits the log messaging update rate for the gyro calibrations since these // can occur frequently with rapid temperature changes. uint64_t gyro_notification_time_nanos_ = 0; uint64_t initialization_start_time_nanos_ = 0; // Pointer to the magnetometer runtime calibration object. OnlineCalibrationThreeAxis *mag_cal_ = nullptr; // Flags that determine which calibration elements are updated with the ASH // API. These are reset during initialization, and latched when a particular // calibration update is detected upon a valid recall of parameters and/or // during runtime. The latching behavior is used to start sending calibration // values of a given type (e.g., bias, over-temp model, etc.) once they are // detected and thereafter. online_calibration::CalibrationTypeFlags accel_cal_update_flags_ = online_calibration::CalibrationTypeFlags::NONE; online_calibration::CalibrationTypeFlags gyro_cal_update_flags_ = online_calibration::CalibrationTypeFlags::NONE; online_calibration::CalibrationTypeFlags mag_cal_update_flags_ = online_calibration::CalibrationTypeFlags::NONE; // Pointer to telemetry logger. online_calibration::ResultCallbackInterface *result_callback_ = nullptr; }; } // namespace nano_calibration #endif // LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_NANO_CALIBRATION_NANO_CALIBRATION_H_