Infuse-IoT SDK API 0.0.1
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
imu.h
Go to the documentation of this file.
1
12
13#ifndef INFUSE_SDK_INCLUDE_INFUSE_DRIVERS_IMU_H_
14#define INFUSE_SDK_INCLUDE_INFUSE_DRIVERS_IMU_H_
15
16#include <zephyr/kernel.h>
17#include <zephyr/device.h>
18
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
31
33struct imu_config {
35 struct {
44 struct {
46 uint16_t sample_rate_hz;
50 bool low_power;
53 struct {
55 uint16_t sample_rate_hz;
59};
60
72
80 int (*configure)(const struct device *dev, const struct imu_config *config,
81 struct imu_config_output *output);
83 int (*data_wait)(const struct device *dev, k_timeout_t timeout);
85 int (*data_read)(const struct device *dev, struct imu_sample_array *samples,
86 uint16_t max_samples);
87#if defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__)
89 int (*self_test)(const struct device *dev);
90#endif /* defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__) */
91};
92
104static inline int imu_configure(const struct device *dev, const struct imu_config *config,
105 struct imu_config_output *output)
106{
107 const struct infuse_imu_api *api = dev->api;
108
109 return api->configure(dev, config, output);
110}
111
121static inline int imu_data_wait(const struct device *dev, k_timeout_t timeout)
122{
123 const struct infuse_imu_api *api = dev->api;
124
125 return api->data_wait(dev, timeout);
126}
127
140static inline int imu_data_read(const struct device *dev, struct imu_sample_array *samples,
141 uint16_t max_samples)
142{
143 const struct infuse_imu_api *api = dev->api;
144
145 return api->data_read(dev, samples, max_samples);
146}
147
148#if defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__)
157static inline int imu_self_test(const struct device *dev)
158{
159 const struct infuse_imu_api *api = dev->api;
160
161 if (api->self_test == NULL) {
162 return -ENOTSUP;
163 }
164 return api->self_test(dev);
165}
166#endif /* defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__) */
167
175static inline int16_t imu_accelerometer_1g(uint8_t full_scale)
176{
177 switch (full_scale) {
178 case 2:
179 return 16384;
180 case 4:
181 return 8192;
182 case 8:
183 return 4096;
184 case 16:
185 return 2048;
186 default:
187 return -1;
188 }
189}
190
198static inline uint32_t imu_sample_period(const struct imu_sensor_meta *meta)
199{
200 if (meta->num < 2) {
201 return 0;
202 }
203 return meta->buffer_period_ticks / (meta->num - 1);
204}
205
213static inline uint16_t imu_sample_rate(const struct imu_sensor_meta *meta)
214{
215 uint32_t period_us = k_ticks_to_us_near32(imu_sample_period(meta));
216
217 if (period_us == 0) {
218 return 0;
219 }
220 return 1000000 / period_us;
221}
222
231static inline k_ticks_t imu_sample_timestamp(const struct imu_sensor_meta *meta, uint8_t sample)
232{
233 if (meta->num < 2) {
234 return meta->timestamp_ticks;
235 }
236 return meta->timestamp_ticks + (sample * meta->buffer_period_ticks / (meta->num - 1));
237}
238
262
279 const struct imu_sample *input, uint16_t num_input);
280
284
285#ifdef __cplusplus
286}
287#endif
288
289#endif /* INFUSE_SDK_INCLUDE_INFUSE_DRIVERS_IMU_H_ */
IMU Output data types.
int imu_linear_downsample_scaled(struct imu_linear_downsample_scaled_state *state, const struct imu_sample *input, uint16_t num_input)
Downsample IMU samples to a new frequency using linear interpolation.
static uint16_t imu_sample_rate(const struct imu_sensor_meta *meta)
Get the approximate sample rate of a buffer.
Definition imu.h:213
static int imu_self_test(const struct device *dev)
Run self-test functionality on the IMU.
Definition imu.h:157
static k_ticks_t imu_sample_timestamp(const struct imu_sensor_meta *meta, uint8_t sample)
Get the local tick counter of a given sample in a buffer.
Definition imu.h:231
static int16_t imu_accelerometer_1g(uint8_t full_scale)
Convert a full scale range to an expected value for 1G.
Definition imu.h:175
static uint32_t imu_sample_period(const struct imu_sensor_meta *meta)
Get the local ticks between samples in a buffer.
Definition imu.h:198
static int imu_configure(const struct device *dev, const struct imu_config *config, struct imu_config_output *output)
Configure IMU for operation.
Definition imu.h:104
static int imu_data_wait(const struct device *dev, k_timeout_t timeout)
Wait for FIFO interrupt from IMU.
Definition imu.h:121
static int imu_data_read(const struct device *dev, struct imu_sample_array *samples, uint16_t max_samples)
Read samples from IMU.
Definition imu.h:140
Configured IMU value.
Definition imu.h:62
uint32_t accelerometer_period_us
Expected period between accelerometer samples.
Definition imu.h:64
uint32_t gyroscope_period_us
Expected period between gyroscope samples.
Definition imu.h:66
uint32_t expected_interrupt_period_us
Expected period FIFO interrupts.
Definition imu.h:70
uint32_t magnetometer_period_us
Expected period between magnetometer samples.
Definition imu.h:68
IMU configuration struct.
Definition imu.h:33
struct imu_config::@002066230011174142061264175250353301144202043330 accelerometer
Accelerometer configuration.
uint16_t sample_rate_hz
Sample rate in Hertz.
Definition imu.h:37
struct imu_config::@012327065131013340056006222315027114333325114165 magnetometer
Magnetometer configuration.
uint8_t full_scale_range
Full scale range in G.
Definition imu.h:39
uint16_t fifo_sample_buffer
Requested number of samples to buffer in FIFO before raising interrupt.
Definition imu.h:58
struct imu_config::@337212207024143026276102347134057053356067255150 gyroscope
Gyroscope configuration.
bool low_power
True for low power mode, false for performance.
Definition imu.h:41
State for imu_linear_downsample_scaled.
Definition imu.h:240
uint8_t freq_mult
Multiplier applied to input frequency.
Definition imu.h:256
int16_t scale
Output is scaled as (integer_val/scale)
Definition imu.h:254
uint8_t freq_div
Divider applied to (input_frequency * freq_mult)
Definition imu.h:258
uint16_t output_offset
Current number of samples written to output.
Definition imu.h:252
uint16_t output_size
Size of the axis output arrays.
Definition imu.h:250
uint8_t subsample_idx
Private.
Definition imu.h:260
float * output_z
Buffer storage for Z axis output.
Definition imu.h:248
struct imu_sample last_sample
Private.
Definition imu.h:242
float * output_x
Buffer storage for X axis output.
Definition imu.h:244
float * output_y
Buffer storage for Y axis output.
Definition imu.h:246
FIFO read structure.
Definition data_types.h:56
IMU sample struct.
Definition data_types.h:29
Metadata for each sub-sensor in a FIFO buffer.
Definition data_types.h:42
uint32_t buffer_period_ticks
Real period between first and last samples in buffer.
Definition data_types.h:46
uint16_t num
Number of readings for this sensor.
Definition data_types.h:52
int64_t timestamp_ticks
Local tick counter of first sample.
Definition data_types.h:44
Infuse IMU driver API.
Definition imu.h:78
int(* self_test)(const struct device *dev)
Implementation of imu_self_test.
Definition imu.h:89
int(* data_read)(const struct device *dev, struct imu_sample_array *samples, uint16_t max_samples)
Implementation of imu_data_read.
Definition imu.h:85
int(* configure)(const struct device *dev, const struct imu_config *config, struct imu_config_output *output)
Implementation of imu_configure.
Definition imu.h:80
int(* data_wait)(const struct device *dev, k_timeout_t timeout)
Implementation of imu_data_wait.
Definition imu.h:83