66 lines
1.9 KiB
C
66 lines
1.9 KiB
C
#ifndef IMU_SENSOR_H
|
|
#define IMU_SENSOR_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "fusion_measurement.h"
|
|
#include "fusion_imu_quality.h"
|
|
#include "imu_calibration.h"
|
|
|
|
typedef enum {
|
|
IMU_SENSOR_NONE = 0,
|
|
IMU_SENSOR_TDK_ICM42688,
|
|
IMU_SENSOR_ST_LSM6DSOX,
|
|
IMU_SENSOR_BACKEND_COUNT
|
|
} imu_sensor_backend_t;
|
|
|
|
typedef struct {
|
|
/* Zero selects the active backend's safe default. */
|
|
uint32_t odr_hz;
|
|
unsigned int accel_full_scale_g;
|
|
unsigned int gyro_full_scale_dps;
|
|
/* Auto-detected devices must never share board-specific calibration. */
|
|
imu_calibration_t calibration_by_backend[IMU_SENSOR_BACKEND_COUNT];
|
|
} imu_sensor_config_t;
|
|
|
|
typedef struct {
|
|
uint64_t irq_count;
|
|
uint64_t sample_count;
|
|
uint64_t invalid_sample_count;
|
|
uint64_t spurious_irq_count;
|
|
uint64_t queue_overflow_count;
|
|
uint64_t estimated_missed_sample_count;
|
|
uint64_t last_timestamp_ticks;
|
|
uint32_t configured_odr_hz;
|
|
uint8_t who_am_i;
|
|
imu_sensor_backend_t backend;
|
|
bool initialized;
|
|
bool running;
|
|
bool foreground_polling;
|
|
} imu_sensor_diagnostics_t;
|
|
|
|
void imu_sensor_default_config(imu_sensor_config_t* config);
|
|
bool imu_sensor_init(const imu_sensor_config_t* config);
|
|
bool imu_sensor_start(void);
|
|
void imu_sensor_stop(void);
|
|
|
|
/* Interrupt backend hook. Safe no-op for a foreground-polled backend. */
|
|
void imu_sensor_irq_handler(void);
|
|
|
|
/* Foreground acquisition hook. Safe no-op for an interrupt backend. */
|
|
void imu_sensor_service(void);
|
|
bool imu_sensor_requires_foreground_service(void);
|
|
|
|
bool imu_sensor_take_measurement(fusion_imu_measurement_t* measurement_out);
|
|
void imu_sensor_get_diagnostics(imu_sensor_diagnostics_t* diagnostics_out);
|
|
imu_sensor_backend_t imu_sensor_active_backend(void);
|
|
const char* imu_sensor_backend_name(imu_sensor_backend_t backend);
|
|
bool imu_sensor_quality_profile_for_backend(
|
|
imu_sensor_backend_t backend,
|
|
fusion_imu_quality_profile_t* profile_out);
|
|
bool imu_sensor_active_quality_profile(
|
|
fusion_imu_quality_profile_t* profile_out);
|
|
|
|
#endif
|