Program Listing for File iio_wrapper.h
↰ Return to documentation for file (include/adi_imu/iio_wrapper.h
)
/*******************************************************************************
* @file iio_wrapper.h
* @brief Wrapper for iio library
* @author Vasile Holonec (Vasile.Holonec@analog.com)
*******************************************************************************/
// Copyright 2023 Analog Devices, Inc.
//
// 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 ADI_IMU__IIO_WRAPPER_H_
#define ADI_IMU__IIO_WRAPPER_H_
#define IIO_CONTEXT_ERROR -1
#include <iio.h>
#include <memory>
#include <string>
#include <vector>
#include "adi_imu/adis_register_map.h"
namespace adi_imu
{
class IIOWrapper
{
public:
IIOWrapper();
~IIOWrapper();
void setDeviceDescriptor(std::shared_ptr<ADISRegisterMap> device_descriptor);
int createContext(const char * context);
bool updateBuffer(uint32_t data_selection);
void stopBufferAcquisition();
double getBuffLinearAccelerationX();
double getBuffLinearAccelerationY();
double getBuffLinearAccelerationZ();
double getBuffAngularVelocityX();
double getBuffAngularVelocityY();
double getBuffAngularVelocityZ();
double getBuffDeltaVelocityX();
double getBuffDeltaVelocityY();
double getBuffDeltaVelocityZ();
double getBuffDeltaAngleX();
double getBuffDeltaAngleY();
double getBuffDeltaAngleZ();
double getBuffTemperature();
void getBuffSampleTimestamp(int32_t & sec, uint32_t & nanosec);
bool getConvertedLinearAccelerationX(double & result);
bool getConvertedLinearAccelerationY(double & result);
bool getConvertedLinearAccelerationZ(double & result);
bool getConvertedAngularVelocityX(double & result);
bool getConvertedAngularVelocityY(double & result);
bool getConvertedAngularVelocityZ(double & result);
bool getConvertedDeltaAngleX(double & result);
bool getConvertedDeltaAngleY(double & result);
bool getConvertedDeltaAngleZ(double & result);
bool getConvertedDeltaVelocityX(double & result);
bool getConvertedDeltaVelocityY(double & result);
bool getConvertedDeltaVelocityZ(double & result);
bool getConvertedTemperature(double & result);
bool anglvel_x_calibbias(int32_t & result);
bool update_anglvel_calibbias_x(int32_t val);
bool anglvel_y_calibbias(int32_t & result);
bool update_anglvel_calibbias_y(int32_t val);
bool anglvel_z_calibbias(int32_t & result);
bool update_anglvel_calibbias_z(int32_t val);
bool accel_x_calibbias(int32_t & result);
bool update_accel_calibbias_x(int32_t val);
bool accel_y_calibbias(int32_t & result);
bool update_accel_calibbias_y(int32_t val);
bool accel_z_calibbias(int32_t & result);
bool update_accel_calibbias_z(int32_t val);
bool angvel_x_filter_low_pass_3db(uint32_t & result);
bool update_angvel_x_filter_low_pass_3db(uint32_t val);
bool angvel_y_filter_low_pass_3db(uint32_t & result);
bool update_angvel_y_filter_low_pass_3db(uint32_t val);
bool angvel_z_filter_low_pass_3db(uint32_t & result);
bool update_angvel_z_filter_low_pass_3db(uint32_t val);
bool accel_x_filter_low_pass_3db(uint32_t & result);
bool update_accel_x_filter_low_pass_3db(uint32_t val);
bool accel_y_filter_low_pass_3db(uint32_t & result);
bool update_accel_y_filter_low_pass_3db(uint32_t val);
bool accel_z_filter_low_pass_3db(uint32_t & result);
bool update_accel_z_filter_low_pass_3db(uint32_t val);
bool filter_low_pass_3db_frequency(uint32_t & result);
bool update_filter_low_pass_3db_frequency(uint32_t val);
bool accel_x_calibscale(int32_t & result);
bool accel_y_calibscale(int32_t & result);
bool accel_z_calibscale(int32_t & result);
bool anglvel_x_calibscale(int32_t & result);
bool anglvel_y_calibscale(int32_t & result);
bool anglvel_z_calibscale(int32_t & result);
bool update_accel_calibscale_x(int32_t val);
bool update_accel_calibscale_y(int32_t val);
bool update_accel_calibscale_z(int32_t val);
bool update_anglvel_calibscale_x(int32_t val);
bool update_anglvel_calibscale_y(int32_t val);
bool update_anglvel_calibscale_z(int32_t val);
bool sampling_frequency(double * result);
bool update_sampling_frequency(double val);
bool diag_sensor_initialization_failure(bool & result);
bool diag_data_path_overrun(bool & result);
bool diag_automatic_reset(bool & result);
bool diag_flash_memory_update_error(bool & result);
bool diag_spi_communication_error(bool & result);
bool diag_crc_error(bool & result);
bool diag_standby_mode(bool & result);
bool diag_sensor_self_test_error(bool & result);
bool diag_flash_memory_test_error(bool & result);
bool diag_clock_error(bool & result);
bool diag_gyroscope1_self_test_error(bool & result);
bool diag_gyroscope2_self_test_error(bool & result);
bool diag_acceleration_self_test_error(bool & result);
bool diag_x_axis_gyroscope_failure(bool & result);
bool diag_y_axis_gyroscope_failure(bool & result);
bool diag_z_axis_gyroscope_failure(bool & result);
bool diag_x_axis_accelerometer_failure(bool & result);
bool diag_y_axis_accelerometer_failure(bool & result);
bool diag_z_axis_accelerometer_failure(bool & result);
bool diag_aduc_mcu_fault(bool & result);
bool diag_flash_memory_write_count_exceeded_error(bool & result);
bool gyroscope_measurement_range(std::string & result);
bool internal_sensor_bandwidth(uint32_t & result);
bool update_internal_sensor_bandwidth(uint32_t val);
bool point_of_percussion_alignment(uint32_t & result);
bool update_point_of_percussion_alignment(uint32_t val);
bool linear_acceleration_compensation(uint32_t & result);
bool update_linear_acceleration_compensation(uint32_t val);
bool bias_correction_time_base_control(uint32_t & result);
bool update_bias_correction_time_base_control(uint32_t val);
bool x_axis_gyroscope_bias_correction_enable(uint32_t & result);
bool update_x_axis_gyroscope_bias_correction_enable(uint32_t val);
bool y_axis_gyroscope_bias_correction_enable(uint32_t & result);
bool update_y_axis_gyroscope_bias_correction_enable(uint32_t val);
bool z_axis_gyroscope_bias_correction_enable(uint32_t & result);
bool update_z_axis_gyroscope_bias_correction_enable(uint32_t val);
bool x_axis_accelerometer_bias_correction_enable(uint32_t & result);
bool update_x_axis_accelerometer_bias_correction_enable(uint32_t val);
bool y_axis_accelerometer_bias_correction_enable(uint32_t & result);
bool update_y_axis_accelerometer_bias_correction_enable(uint32_t val);
bool z_axis_accelerometer_bias_correction_enable(uint32_t & result);
bool update_z_axis_accelerometer_bias_correction_enable(uint32_t val);
bool bias_correction_update();
bool factory_calibration_restore();
bool sensor_self_test();
bool flash_memory_update();
bool flash_memory_test();
bool software_reset();
bool firmware_revision(std::string & result);
bool firmware_date(std::string & result);
bool product_id(uint32_t & result);
bool serial_number(uint32_t & result);
bool flash_counter(uint32_t & value);
double get_scale_accel();
double get_scale_anglvel();
double get_scale_deltavelocity();
double get_scale_deltaangl();
double get_scale_temp();
private:
void setDeltaAngleScales(adis_device_id dev_id);
void setDeltaVelocityScales(adis_device_id dev_id);
bool updateField(uint32_t reg, uint32_t val, uint32_t mask);
bool getRawDeltaAngleXFromDebug(int32_t & result);
bool getRawDeltaAngleYFromDebug(int32_t & result);
bool getRawDeltaAngleZFromDebug(int32_t & result);
bool getRawDeltaVelocityXFromDebug(int32_t & result);
bool getRawDeltaVelocityYFromDebug(int32_t & result);
bool getRawDeltaVelocityZFromDebug(int32_t & result);
bool getConvertedDeltaAngleXFromDebug(double & result);
bool getConvertedDeltaAngleYFromDebug(double & result);
bool getConvertedDeltaAngleZFromDebug(double & result);
bool getConvertedDeltaVelocityXFromDebug(double & result);
bool getConvertedDeltaVelocityYFromDebug(double & result);
bool getConvertedDeltaVelocityZFromDebug(double & result);
static struct iio_context * m_iio_context;
static struct iio_device * m_dev;
static struct iio_device * m_dev_trigger;
static struct iio_buffer * m_dev_buffer;
static struct iio_channel * m_channel_accel_x;
static struct iio_channel * m_channel_accel_y;
static struct iio_channel * m_channel_accel_z;
static struct iio_channel * m_channel_anglvel_x;
static struct iio_channel * m_channel_anglvel_y;
static struct iio_channel * m_channel_anglvel_z;
static struct iio_channel * m_channel_deltaangl_x;
static struct iio_channel * m_channel_deltaangl_y;
static struct iio_channel * m_channel_deltaangl_z;
static struct iio_channel * m_channel_deltavelocity_x;
static struct iio_channel * m_channel_deltavelocity_y;
static struct iio_channel * m_channel_deltavelocity_z;
static struct iio_channel * m_channel_temp;
static struct iio_channel * m_channel_timestamp;
static double m_scale_accel_x;
static double m_scale_accel_y;
static double m_scale_accel_z;
static double m_scale_anglvel_x;
static double m_scale_anglvel_y;
static double m_scale_anglvel_z;
static double m_scale_deltaangl_x;
static double m_scale_deltaangl_y;
static double m_scale_deltaangl_z;
static double m_scale_deltavelocity_x;
static double m_scale_deltavelocity_y;
static double m_scale_deltavelocity_z;
static double m_scale_temp;
static long long m_offset_temp;
static std::shared_ptr<ADISRegisterMap> m_device_descriptor;
// Channel identifiers for buffered readings
static uint32_t CHAN_GYRO_X;
static uint32_t CHAN_GYRO_Y;
static uint32_t CHAN_GYRO_Z;
static uint32_t CHAN_ACCEL_X;
static uint32_t CHAN_ACCEL_Y;
static uint32_t CHAN_ACCEL_Z;
static uint32_t CHAN_TEMP;
static uint32_t CHAN_DELTA_ANGL_X;
static uint32_t CHAN_DELTA_ANGL_Y;
static uint32_t CHAN_DELTA_ANGL_Z;
static uint32_t CHAN_DELTA_VEL_X;
static uint32_t CHAN_DELTA_VEL_Y;
static uint32_t CHAN_DELTA_VEL_Z;
static uint32_t CHAN_DATA_TIMESTAMP;
static uint32_t NO_OF_CHANS;
static uint32_t buff_write_idx;
static uint32_t buff_read_idx;
static std::vector<std::vector<uint32_t>> buff_data;
static double samp_freq;
static uint32_t no_of_samp;
static uint32_t current_data_selection;
static bool has_delta_channels;
static bool has_timestamp_channel;
public:
static ssize_t demux_sample(const struct iio_channel * chn, void * sample, size_t size, void * d);
};
} // namespace adi_imu
#endif // ADI_IMU__IIO_WRAPPER_H_