blob: 82a8396d5d85ee195da784c6053b6474d231c6fa [file] [log] [blame]
/*
* 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 <ash.h>
#include <chre.h>
#include <stdbool.h>
#include <stdint.h>
#include <cstdint>
#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_