blob: c89306527637847113d44646fc4536630c9edef0 [file] [log] [blame]
/*
* Copyright (C) 2018 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.
*/
#ifndef LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_ONLINE_CALIBRATION_COMMON_DATA_ONLINE_CALIBRATION_H_
#define LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_ONLINE_CALIBRATION_COMMON_DATA_ONLINE_CALIBRATION_H_
#include <string.h>
#include "calibration/online_calibration/common_data/calibration_callback.h"
#include "calibration/online_calibration/common_data/calibration_data.h"
#include "calibration/online_calibration/common_data/sensor_data.h"
namespace online_calibration {
/*
* This abstract base class provides a set of general interface functions for
* calibration algorithms. The data structures used are intended to be lean and
* portable to a wide variety of software and hardware systems. Algorithm
* wrappers may use this as a basis for providing the following functionality:
*
* SetMeasurement - Delivers new sensor data.
* SetInitialCalibration - Initializes the algorithm's calibration data.
* GetSensorCalibration - Retrieves the latest calibration data set.
* new_calibration_ready - Used to poll for new calibration updates.
* SetCalibrationCallback - User provides a pointer its own Callback object.
* UpdateDynamicSystemSettings - Provides feedback to adjust system behavior.
* get_sensor_type - Returns the sensor type which is being calibrated.
*
* NOTE 1: This class accomodates two methods of providing calibration updates.
* Either, or both, may be used depending on system requirements. 1) Polling can
* be achieved with new_calibration_ready/GetSensorCalibration functions. 2)
* Callback notification of new calibration updates can managed using the
* SetCalibrationCallback function.
*
* NOTE 2: This code implementation specifically avoids using standard template
* libraries (STL) and other external API’s since they may not be fully
* supported on embedded hardware targets. Only basic C/C++ support will be
* assumed.
*/
// CalibrationType: Sets the calibration type (e.g., CalibrationDataThreeAxis).
template <class CalibrationType>
class OnlineCalibration {
public:
// Virtual destructor.
virtual ~OnlineCalibration() {}
// Sends new sensor data to the calibration algorithm, and returns the state
// of the calibration update flags, 'cal_update_polling_flags_'.
virtual CalibrationTypeFlags SetMeasurement(const SensorData& sample) = 0;
// Sets the initial calibration data of the calibration algorithm. Returns
// "true" if set successfully.
virtual bool SetInitialCalibration(const CalibrationType& cal_data) = 0;
// Polling Updates: New calibration updates are generated during
// SetMeasurement and the 'cal_update_polling_flags_' are set according to
// which calibration values have changed. To prevent missing updates in
// systems that use polling, this bitmask remains latched until the
// calibration data is retrieved with this function.
const CalibrationType& GetSensorCalibration() const {
cal_update_polling_flags_ = CalibrationTypeFlags::NONE;
return cal_data_;
}
// Polling Updates: This function returns 'cal_update_polling_flags_' to
// indicate which calibration components have a pending update. The updated
// calibration data may be retrieved with GetSensorCalibration, and the
// 'cal_update_polling_flags_' will reset.
CalibrationTypeFlags new_calibration_ready() const {
return cal_update_polling_flags_;
}
// Sets the pointer to the CallbackInterface object used for notification of
// new calibration updates.
void SetCalibrationCallback(
CallbackInterface<CalibrationType>* calibration_callback) {
calibration_callback_ = calibration_callback;
}
// This provides operational feedback to the system based on status such as
// active sensors and sampling rates. Feedback may include adjusting
// system-level settings including sensor sampling rate, latency,
// active/passive subscription, etc. Returns "true" if a system setting is
// requested to change.
// TODO(davejacobs) -- Determine implementation details.
virtual bool UpdateDynamicSystemSettings(
/*System Parameters In, System Feedback Out*/) const {
return false;
}
// Returns the sensor-type this calibration algorithm provides updates for.
virtual SensorType get_sensor_type() const = 0;
protected:
// Helper function that activates the registered callback.
void OnNotifyCalibrationUpdate(CalibrationTypeFlags cal_update_flags) const {
if (calibration_callback_ != nullptr) {
calibration_callback_->Call(cal_data_, cal_update_flags);
}
}
// Helper function used to initialize the calibration data.
void InitializeCalData() {
cal_data_.reset();
cal_data_.type = get_sensor_type();
cal_update_polling_flags_ = CalibrationTypeFlags::NONE;
}
// Stores the sensor calibration data.
CalibrationType cal_data_;
// Tracks the most recent sensor temperature value.
float temperature_celsius_ = kInvalidTemperatureCelsius;
// This bitmask indicates which subset of calibration parameters have changed
// and is used specifically for polling; the callback notification passes its
// own set of update flags which do not need this latching behavior. Marked
// mutable so that these flags may be reset when GetSensorCalibration is
// called.
mutable CalibrationTypeFlags cal_update_polling_flags_ =
CalibrationTypeFlags::NONE;
private:
// Pointer to a callback object.
CallbackInterface<CalibrationType>* calibration_callback_ = nullptr;
};
} // namespace online_calibration
#endif // LOCATION_LBS_CONTEXTHUB_NANOAPPS_CALIBRATION_ONLINE_CALIBRATION_COMMON_DATA_ONLINE_CALIBRATION_H_