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
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
19#ifdef __cplusplus
20extern "C" {
21#endif
22
30struct imu_config {
31 struct {
39 struct {
41 uint16_t sample_rate_hz;
45 bool low_power;
47 struct {
48 uint16_t sample_rate_hz;
52};
53
65
66struct imu_sample {
67 int16_t x;
68 int16_t y;
69 int16_t z;
70} __packed;
71
81 uint16_t offset;
83 uint16_t num;
84};
85
97
99#define IMU_SAMPLE_ARRAY_TYPE_DEFINE(type_name, max_samples) \
100 struct type_name { \
101 struct imu_sample_array header; \
102 struct imu_sample samples[max_samples]; \
103 }
104
106#define IMU_SAMPLE_ARRAY_CREATE(name, max_samples) \
107 IMU_SAMPLE_ARRAY_TYPE_DEFINE(_anon_t_##name, max_samples); \
108 static struct _anon_t_##name _anon_##name; \
109 static struct imu_sample_array *name = (void *)&_anon_##name
110
112 int (*configure)(const struct device *dev, const struct imu_config *config,
113 struct imu_config_output *output);
114 int (*data_wait)(const struct device *dev, k_timeout_t timeout);
115 int (*data_read)(const struct device *dev, struct imu_sample_array *samples,
116 uint16_t max_samples);
117#if defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__)
118 int (*self_test)(const struct device *dev);
119#endif /* defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__) */
120};
121
133static inline int imu_configure(const struct device *dev, const struct imu_config *config,
134 struct imu_config_output *output)
135{
136 const struct infuse_imu_api *api = dev->api;
137
138 return api->configure(dev, config, output);
139}
140
150static inline int imu_data_wait(const struct device *dev, k_timeout_t timeout)
151{
152 const struct infuse_imu_api *api = dev->api;
153
154 return api->data_wait(dev, timeout);
155}
156
169static inline int imu_data_read(const struct device *dev, struct imu_sample_array *samples,
170 uint16_t max_samples)
171{
172 const struct infuse_imu_api *api = dev->api;
173
174 return api->data_read(dev, samples, max_samples);
175}
176
177#if defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__)
186static inline int imu_self_test(const struct device *dev)
187{
188 const struct infuse_imu_api *api = dev->api;
189
190 if (api->self_test == NULL) {
191 return -ENOTSUP;
192 }
193 return api->self_test(dev);
194}
195#endif /* defined(CONFIG_INFUSE_IMU_SELF_TEST) || defined(__DOXYGEN__) */
196
204static inline int16_t imu_accelerometer_1g(uint8_t full_scale)
205{
206 switch (full_scale) {
207 case 2:
208 return 16384;
209 case 4:
210 return 8192;
211 case 8:
212 return 4096;
213 case 16:
214 return 2048;
215 default:
216 return -1;
217 }
218}
219
227static inline uint32_t imu_sample_period(const struct imu_sensor_meta *meta)
228{
229 if (meta->num < 2) {
230 return 0;
231 }
232 return meta->buffer_period_ticks / (meta->num - 1);
233}
234
242static inline uint16_t imu_sample_rate(const struct imu_sensor_meta *meta)
243{
244 uint32_t period_us = k_ticks_to_us_near32(imu_sample_period(meta));
245
246 if (period_us == 0) {
247 return 0;
248 }
249 return 1000000 / period_us;
250}
251
260static inline k_ticks_t imu_sample_timestamp(const struct imu_sensor_meta *meta, uint8_t sample)
261{
262 if (meta->num < 2) {
263 return meta->timestamp_ticks;
264 }
265 return meta->timestamp_ticks + (sample * meta->buffer_period_ticks / (meta->num - 1));
266}
267
291
308 const struct imu_sample *input, uint16_t num_input);
309
314#ifdef __cplusplus
315}
316#endif
317
318#endif /* INFUSE_SDK_INCLUDE_INFUSE_DRIVERS_IMU_H_ */
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:242
static int imu_self_test(const struct device *dev)
Run self-test functionality on the IMU.
Definition imu.h:186
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:260
static int16_t imu_accelerometer_1g(uint8_t full_scale)
Convert a full scale range to an expected value for 1G.
Definition imu.h:204
static uint32_t imu_sample_period(const struct imu_sensor_meta *meta)
Get the local ticks between samples in a buffer.
Definition imu.h:227
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:133
static int imu_data_wait(const struct device *dev, k_timeout_t timeout)
Wait for FIFO interrupt from IMU.
Definition imu.h:150
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:169
Configured IMU value.
Definition imu.h:55
uint32_t accelerometer_period_us
Expected period between accelerometer samples.
Definition imu.h:57
uint32_t gyroscope_period_us
Expected period between gyroscope samples.
Definition imu.h:59
uint32_t expected_interrupt_period_us
Expected period FIFO interrupts.
Definition imu.h:63
uint32_t magnetometer_period_us
Expected period between magnetometer samples.
Definition imu.h:61
IMU configuration struct.
Definition imu.h:30
uint16_t sample_rate_hz
Sample rate in Hertz.
Definition imu.h:33
struct imu_config::@14 gyroscope
uint8_t full_scale_range
Full scale range in G.
Definition imu.h:35
uint16_t fifo_sample_buffer
Requested number of samples to buffer in FIFO before raising interrupt.
Definition imu.h:51
struct imu_config::@13 accelerometer
struct imu_config::@15 magnetometer
uint16_t full_scale_range
Full scale range in deg/s.
Definition imu.h:43
bool low_power
True for low power mode, false for performance.
Definition imu.h:37
State for imu_linear_downsample_scaled.
Definition imu.h:269
uint8_t freq_mult
Multiplier applied to input frequency.
Definition imu.h:285
int16_t scale
Output is scaled as (integer_val/scale)
Definition imu.h:283
uint8_t freq_div
Divider applied to (input_frequency * freq_mult)
Definition imu.h:287
uint16_t output_offset
Current number of samples written to output.
Definition imu.h:281
uint16_t output_size
Size of the axis output arrays.
Definition imu.h:279
uint8_t subsample_idx
Private.
Definition imu.h:289
float * output_z
Buffer storage for Z axis output.
Definition imu.h:277
struct imu_sample last_sample
Private.
Definition imu.h:271
float * output_x
Buffer storage for X axis output.
Definition imu.h:273
float * output_y
Buffer storage for Y axis output.
Definition imu.h:275
FIFO read structure.
Definition imu.h:87
struct imu_sensor_meta gyroscope
Metadata for gyroscope samples.
Definition imu.h:91
struct imu_sensor_meta accelerometer
Metadata for accelerometer samples.
Definition imu.h:89
struct imu_sample samples[]
Linear array of all samples.
Definition imu.h:95
struct imu_sensor_meta magnetometer
Metadata for magnetometer samples.
Definition imu.h:93
Definition imu.h:66
int16_t x
Definition imu.h:67
int16_t z
Definition imu.h:69
int16_t y
Definition imu.h:68
Metadata for each sub-sensor in a FIFO buffer.
Definition imu.h:73
uint32_t buffer_period_ticks
Real period between first and last samples in buffer.
Definition imu.h:77
uint16_t offset
Offset into sample array of sensor.
Definition imu.h:81
uint16_t num
Number of readings for this sensor.
Definition imu.h:83
uint16_t full_scale_range
Accel = G, Gyro = DPS, Mag = ?
Definition imu.h:79
int64_t timestamp_ticks
Local tick counter of first sample.
Definition imu.h:75
Definition imu.h:111
int(* self_test)(const struct device *dev)
Definition imu.h:118
int(* data_read)(const struct device *dev, struct imu_sample_array *samples, uint16_t max_samples)
Definition imu.h:115
int(* configure)(const struct device *dev, const struct imu_config *config, struct imu_config_output *output)
Definition imu.h:112
int(* data_wait)(const struct device *dev, k_timeout_t timeout)
Definition imu.h:114