Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sensor.h
Go to the documentation of this file.
1
7/*
8 * Copyright (c) 2016 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_H_
13#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_H_
14
22#include <errno.h>
23#include <stdlib.h>
24
25#include <zephyr/device.h>
27#include <zephyr/dsp/types.h>
28#include <zephyr/rtio/rtio.h>
30#include <zephyr/types.h>
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
54};
55
109
118
125
128
131
136
139
142
149
152
189
192
197
203
208};
209
239
242
245
248
251
258
264
269};
270
279};
280
301 /* Hysteresis for trigger thresholds. */
335
341
346};
347
355typedef void (*sensor_trigger_handler_t)(const struct device *dev,
356 const struct sensor_trigger *trigger);
357
364typedef int (*sensor_attr_set_t)(const struct device *dev,
365 enum sensor_channel chan,
366 enum sensor_attribute attr,
367 const struct sensor_value *val);
368
375typedef int (*sensor_attr_get_t)(const struct device *dev,
376 enum sensor_channel chan,
377 enum sensor_attribute attr,
378 struct sensor_value *val);
379
386typedef int (*sensor_trigger_set_t)(const struct device *dev,
387 const struct sensor_trigger *trig,
395typedef int (*sensor_sample_fetch_t)(const struct device *dev,
396 enum sensor_channel chan);
403typedef int (*sensor_channel_get_t)(const struct device *dev,
404 enum sensor_channel chan,
405 struct sensor_value *val);
406
424 int (*get_frame_count)(const uint8_t *buffer, enum sensor_channel channel,
425 size_t channel_idx, uint16_t *frame_count);
426
439 int (*get_size_info)(enum sensor_channel channel, size_t *base_size, size_t *frame_size);
440
467 int (*decode)(const uint8_t *buffer, enum sensor_channel channel, size_t channel_idx,
468 uint32_t *fit, uint16_t max_count, void *data_out);
469};
470
501};
502
506#define SENSOR_DECODE_CONTEXT_INIT(decoder_, buffer_, channel_, channel_index_) \
507 { \
508 .decoder = (decoder_), \
509 .buffer = (buffer_), \
510 .channel = (channel_), \
511 .channel_idx = (channel_index_), \
512 .fit = 0, \
513 }
514
523static inline int sensor_decode(struct sensor_decode_context *ctx, void *out, uint16_t max_count)
524{
525 return ctx->decoder->decode(ctx->buffer, ctx->channel, ctx->channel_idx, &ctx->fit,
526 max_count, out);
527}
528
530 size_t *frame_size);
531
538typedef int (*sensor_get_decoder_t)(const struct device *dev,
539 const struct sensor_decoder_api **api);
540
541/*
542 * Internal data structure used to store information about the IODevice for async reading and
543 * streaming sensor data.
544 */
546 const struct device *sensor;
548 size_t count;
549 const size_t max;
550};
551
566#define SENSOR_DT_READ_IODEV(name, dt_node, ...) \
567 static enum sensor_channel __channel_array_##name[] = {__VA_ARGS__}; \
568 static struct sensor_read_config __sensor_read_config_##name = { \
569 .sensor = DEVICE_DT_GET(dt_node), \
570 .channels = __channel_array_##name, \
571 .count = ARRAY_SIZE(__channel_array_##name), \
572 .max = ARRAY_SIZE(__channel_array_##name), \
573 }; \
574 RTIO_IODEV_DEFINE(name, &__sensor_iodev_api, &__sensor_read_config_##name)
575
576/* Used to submit an RTIO sqe to the sensor's iodev */
577typedef int (*sensor_submit_t)(const struct device *sensor, struct rtio_iodev_sqe *sqe);
578
579/* The default decoder API */
580extern const struct sensor_decoder_api __sensor_default_decoder;
581
582/* The default sensor iodev API */
583extern const struct rtio_iodev_api __sensor_iodev_api;
584
585__subsystem struct sensor_driver_api {
593};
594
607__syscall int sensor_attr_set(const struct device *dev,
608 enum sensor_channel chan,
609 enum sensor_attribute attr,
610 const struct sensor_value *val);
611
612static inline int z_impl_sensor_attr_set(const struct device *dev,
613 enum sensor_channel chan,
614 enum sensor_attribute attr,
615 const struct sensor_value *val)
616{
617 const struct sensor_driver_api *api =
618 (const struct sensor_driver_api *)dev->api;
619
620 if (api->attr_set == NULL) {
621 return -ENOSYS;
622 }
623
624 return api->attr_set(dev, chan, attr, val);
625}
626
639__syscall int sensor_attr_get(const struct device *dev,
640 enum sensor_channel chan,
641 enum sensor_attribute attr,
642 struct sensor_value *val);
643
644static inline int z_impl_sensor_attr_get(const struct device *dev,
645 enum sensor_channel chan,
646 enum sensor_attribute attr,
647 struct sensor_value *val)
648{
649 const struct sensor_driver_api *api =
650 (const struct sensor_driver_api *)dev->api;
651
652 if (api->attr_get == NULL) {
653 return -ENOSYS;
654 }
655
656 return api->attr_get(dev, chan, attr, val);
657}
658
681static inline int sensor_trigger_set(const struct device *dev,
682 const struct sensor_trigger *trig,
684{
685 const struct sensor_driver_api *api =
686 (const struct sensor_driver_api *)dev->api;
687
688 if (api->trigger_set == NULL) {
689 return -ENOSYS;
690 }
691
692 return api->trigger_set(dev, trig, handler);
693}
694
713__syscall int sensor_sample_fetch(const struct device *dev);
714
715static inline int z_impl_sensor_sample_fetch(const struct device *dev)
716{
717 const struct sensor_driver_api *api =
718 (const struct sensor_driver_api *)dev->api;
719
720 return api->sample_fetch(dev, SENSOR_CHAN_ALL);
721}
722
744__syscall int sensor_sample_fetch_chan(const struct device *dev,
745 enum sensor_channel type);
746
747static inline int z_impl_sensor_sample_fetch_chan(const struct device *dev,
748 enum sensor_channel type)
749{
750 const struct sensor_driver_api *api =
751 (const struct sensor_driver_api *)dev->api;
752
753 return api->sample_fetch(dev, type);
754}
755
777__syscall int sensor_channel_get(const struct device *dev,
778 enum sensor_channel chan,
779 struct sensor_value *val);
780
781static inline int z_impl_sensor_channel_get(const struct device *dev,
782 enum sensor_channel chan,
783 struct sensor_value *val)
784{
785 const struct sensor_driver_api *api =
786 (const struct sensor_driver_api *)dev->api;
787
788 return api->channel_get(dev, chan, val);
789}
790
791#if defined(CONFIG_SENSOR_ASYNC_API) || defined(__DOXYGEN__)
792
793/*
794 * Generic data structure used for encoding the sample timestamp and number of channels sampled.
795 */
796struct __attribute__((__packed__)) sensor_data_generic_header {
797 /* The timestamp at which the data was collected from the sensor */
799
800 /*
801 * The number of channels present in the frame. This will be the true number of elements in
802 * channel_info and in the q31 values that follow the header.
803 */
805
806 /* Shift value for all samples in the frame */
808
809 /* This padding is needed to make sure that the 'channels' field is aligned */
810 int8_t _padding[sizeof(enum sensor_channel) - 1];
811
812 /* Channels present in the frame */
813 enum sensor_channel channels[0];
814};
815
824#define SENSOR_CHANNEL_3_AXIS(chan) \
825 ((chan) == SENSOR_CHAN_ACCEL_XYZ || (chan) == SENSOR_CHAN_GYRO_XYZ || \
826 (chan) == SENSOR_CHAN_MAGN_XYZ)
827
836__syscall int sensor_get_decoder(const struct device *dev,
837 const struct sensor_decoder_api **decoder);
838
839static inline int z_impl_sensor_get_decoder(const struct device *dev,
840 const struct sensor_decoder_api **decoder)
841{
842 const struct sensor_driver_api *api = (const struct sensor_driver_api *)dev->api;
843
844 __ASSERT_NO_MSG(api != NULL);
845
846 if (api->get_decoder == NULL) {
847 *decoder = &__sensor_default_decoder;
848 return 0;
849 }
850
851 return api->get_decoder(dev, decoder);
852}
853
872__syscall int sensor_reconfigure_read_iodev(struct rtio_iodev *iodev, const struct device *sensor,
873 const enum sensor_channel *channels,
874 size_t num_channels);
875
876static inline int z_impl_sensor_reconfigure_read_iodev(struct rtio_iodev *iodev,
877 const struct device *sensor,
878 const enum sensor_channel *channels,
879 size_t num_channels)
880{
881 struct sensor_read_config *cfg = (struct sensor_read_config *)iodev->data;
882
883 if (cfg->max < num_channels) {
884 return -ENOMEM;
885 }
886
887 cfg->sensor = sensor;
888 memcpy(cfg->channels, channels, num_channels * sizeof(enum sensor_channel));
889 cfg->count = num_channels;
890 return 0;
891 return 0;
892}
893
907static inline int sensor_read(struct rtio_iodev *iodev, struct rtio *ctx, void *userdata)
908{
909 if (IS_ENABLED(CONFIG_USERSPACE)) {
910 struct rtio_sqe sqe;
911
913 rtio_sqe_copy_in(ctx, &sqe, 1);
914 } else {
915 struct rtio_sqe *sqe = rtio_sqe_acquire(ctx);
916
917 if (sqe == NULL) {
918 return -ENOMEM;
919 }
921 }
922 rtio_submit(ctx, 0);
923 return 0;
924}
925
938 void *userdata);
939
952
953#endif /* defined(CONFIG_SENSOR_ASYNC_API) || defined(__DOXYGEN__) */
954
958#define SENSOR_G 9806650LL
959
963#define SENSOR_PI 3141592LL
964
973static inline int32_t sensor_ms2_to_g(const struct sensor_value *ms2)
974{
975 int64_t micro_ms2 = ms2->val1 * 1000000LL + ms2->val2;
976
977 if (micro_ms2 > 0) {
978 return (micro_ms2 + SENSOR_G / 2) / SENSOR_G;
979 } else {
980 return (micro_ms2 - SENSOR_G / 2) / SENSOR_G;
981 }
982}
983
990static inline void sensor_g_to_ms2(int32_t g, struct sensor_value *ms2)
991{
992 ms2->val1 = ((int64_t)g * SENSOR_G) / 1000000LL;
993 ms2->val2 = ((int64_t)g * SENSOR_G) % 1000000LL;
994}
995
1004static inline int32_t sensor_ms2_to_ug(const struct sensor_value *ms2)
1005{
1006 int64_t micro_ms2 = (ms2->val1 * INT64_C(1000000)) + ms2->val2;
1007
1008 return (micro_ms2 * 1000000LL) / SENSOR_G;
1009}
1010
1017static inline void sensor_ug_to_ms2(int32_t ug, struct sensor_value *ms2)
1018{
1019 ms2->val1 = ((int64_t)ug * SENSOR_G / 1000000LL) / 1000000LL;
1020 ms2->val2 = ((int64_t)ug * SENSOR_G / 1000000LL) % 1000000LL;
1021}
1022
1030static inline int32_t sensor_rad_to_degrees(const struct sensor_value *rad)
1031{
1032 int64_t micro_rad_s = rad->val1 * 1000000LL + rad->val2;
1033
1034 if (micro_rad_s > 0) {
1035 return (micro_rad_s * 180LL + SENSOR_PI / 2) / SENSOR_PI;
1036 } else {
1037 return (micro_rad_s * 180LL - SENSOR_PI / 2) / SENSOR_PI;
1038 }
1039}
1040
1047static inline void sensor_degrees_to_rad(int32_t d, struct sensor_value *rad)
1048{
1049 rad->val1 = ((int64_t)d * SENSOR_PI / 180LL) / 1000000LL;
1050 rad->val2 = ((int64_t)d * SENSOR_PI / 180LL) % 1000000LL;
1051}
1052
1064static inline int32_t sensor_rad_to_10udegrees(const struct sensor_value *rad)
1065{
1066 int64_t micro_rad_s = rad->val1 * 1000000LL + rad->val2;
1067
1068 return (micro_rad_s * 180LL * 100000LL) / SENSOR_PI;
1069}
1070
1077static inline void sensor_10udegrees_to_rad(int32_t d, struct sensor_value *rad)
1078{
1079 rad->val1 = ((int64_t)d * SENSOR_PI / 180LL / 100000LL) / 1000000LL;
1080 rad->val2 = ((int64_t)d * SENSOR_PI / 180LL / 100000LL) % 1000000LL;
1081}
1082
1089static inline double sensor_value_to_double(const struct sensor_value *val)
1090{
1091 return (double)val->val1 + (double)val->val2 / 1000000;
1092}
1093
1100static inline float sensor_value_to_float(const struct sensor_value *val)
1101{
1102 return (float)val->val1 + (float)val->val2 / 1000000;
1103}
1104
1112static inline int sensor_value_from_double(struct sensor_value *val, double inp)
1113{
1114 if (inp < INT32_MIN || inp > INT32_MAX) {
1115 return -ERANGE;
1116 }
1117
1118 double val2 = (inp - (int32_t)inp) * 1000000.0;
1119
1120 if (val2 < INT32_MIN || val2 > INT32_MAX) {
1121 return -ERANGE;
1122 }
1123
1124 val->val1 = (int32_t)inp;
1125 val->val2 = (int32_t)val2;
1126
1127 return 0;
1128}
1129
1137static inline int sensor_value_from_float(struct sensor_value *val, float inp)
1138{
1139 float val2 = (inp - (int32_t)inp) * 1000000.0f;
1140
1141 if (val2 < INT32_MIN || val2 > (float)(INT32_MAX - 1)) {
1142 return -ERANGE;
1143 }
1144
1145 val->val1 = (int32_t)inp;
1146 val->val2 = (int32_t)val2;
1147
1148 return 0;
1149}
1150
1151#ifdef CONFIG_SENSOR_INFO
1152
1153struct sensor_info {
1154 const struct device *dev;
1155 const char *vendor;
1156 const char *model;
1157 const char *friendly_name;
1158};
1159
1160#define SENSOR_INFO_INITIALIZER(_dev, _vendor, _model, _friendly_name) \
1161 { \
1162 .dev = _dev, \
1163 .vendor = _vendor, \
1164 .model = _model, \
1165 .friendly_name = _friendly_name, \
1166 }
1167
1168#define SENSOR_INFO_DEFINE(name, ...) \
1169 static const STRUCT_SECTION_ITERABLE(sensor_info, name) = \
1170 SENSOR_INFO_INITIALIZER(__VA_ARGS__)
1171
1172#define SENSOR_INFO_DT_NAME(node_id) \
1173 _CONCAT(__sensor_info, DEVICE_DT_NAME_GET(node_id))
1174
1175#define SENSOR_INFO_DT_DEFINE(node_id) \
1176 SENSOR_INFO_DEFINE(SENSOR_INFO_DT_NAME(node_id), \
1177 DEVICE_DT_GET(node_id), \
1178 DT_NODE_VENDOR_OR(node_id, NULL), \
1179 DT_NODE_MODEL_OR(node_id, NULL), \
1180 DT_PROP_OR(node_id, friendly_name, NULL)) \
1181
1182#else
1183
1184#define SENSOR_INFO_DEFINE(name, ...)
1185#define SENSOR_INFO_DT_DEFINE(node_id)
1186
1187#endif /* CONFIG_SENSOR_INFO */
1188
1216#define SENSOR_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
1217 data_ptr, cfg_ptr, level, prio, \
1218 api_ptr, ...) \
1219 DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
1220 data_ptr, cfg_ptr, level, prio, \
1221 api_ptr, __VA_ARGS__); \
1222 \
1223 SENSOR_INFO_DT_DEFINE(node_id);
1224
1234#define SENSOR_DEVICE_DT_INST_DEFINE(inst, ...) \
1235 SENSOR_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
1236
1243static inline int64_t sensor_value_to_milli(const struct sensor_value *val)
1244{
1245 return ((int64_t)val->val1 * 1000) + val->val2 / 1000;
1246}
1247
1254static inline int64_t sensor_value_to_micro(const struct sensor_value *val)
1255{
1256 return ((int64_t)val->val1 * 1000000) + val->val2;
1257}
1258
1263#if defined(CONFIG_HAS_DTS) || defined(__DOXYGEN__)
1264
1270#define SENSOR_DECODER_NAME() UTIL_CAT(DT_DRV_COMPAT, __decoder_api)
1271
1279#define SENSOR_DECODER_DT_GET(node_id) \
1280 &UTIL_CAT(DT_STRING_TOKEN_BY_IDX(node_id, compatible, 0), __decoder_api)
1281
1297#define SENSOR_DECODER_API_DT_DEFINE() \
1298 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), (), (static)) \
1299 const STRUCT_SECTION_ITERABLE(sensor_decoder_api, SENSOR_DECODER_NAME())
1300
1301#define Z_MAYBE_SENSOR_DECODER_DECLARE_INTERNAL_IDX(node_id, prop, idx) \
1302 extern const struct sensor_decoder_api UTIL_CAT( \
1303 DT_STRING_TOKEN_BY_IDX(node_id, prop, idx), __decoder_api);
1304
1305#define Z_MAYBE_SENSOR_DECODER_DECLARE_INTERNAL(node_id) \
1306 COND_CODE_1(DT_NODE_HAS_PROP(node_id, compatible), \
1307 (DT_FOREACH_PROP_ELEM(node_id, compatible, \
1308 Z_MAYBE_SENSOR_DECODER_DECLARE_INTERNAL_IDX)), \
1309 ())
1310
1311DT_FOREACH_STATUS_OKAY_NODE(Z_MAYBE_SENSOR_DECODER_DECLARE_INTERNAL)
1312#endif /* defined(CONFIG_HAS_DTS) || defined(__DOXYGEN__) */
1313
1314#ifdef __cplusplus
1315}
1316#endif
1317
1318#include <syscalls/sensor.h>
1319
1320#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_H_ */
irp nz macro MOVR cc d
Definition: asm-macro-32-bit-gnu.h:11
System error numbers.
#define DT_FOREACH_STATUS_OKAY_NODE(fn)
Invokes fn for every status okay node in the tree.
Definition: devicetree.h:2498
#define RTIO_PRIO_NORM
Normal priority.
Definition: rtio.h:68
static void rtio_sqe_prep_read_with_pool(struct rtio_sqe *sqe, const struct rtio_iodev *iodev, int8_t prio, void *userdata)
Prepare a read op submission with context's mempool.
Definition: rtio.h:511
static int rtio_sqe_copy_in(struct rtio *r, const struct rtio_sqe *sqes, size_t sqe_count)
Copy an array of SQEs into the queue.
Definition: rtio.h:1348
static struct rtio_sqe * rtio_sqe_acquire(struct rtio *r)
Acquire a single submission queue event if available.
Definition: rtio.h:884
int rtio_submit(struct rtio *r, uint32_t wait_count)
Submit I/O requests to the underlying executor.
#define SENSOR_G
The value of gravitational constant in micro m/s^2.
Definition: sensor.h:958
static int sensor_decode(struct sensor_decode_context *ctx, void *out, uint16_t max_count)
Decode N frames using a sensor_decode_context.
Definition: sensor.h:523
static int32_t sensor_rad_to_degrees(const struct sensor_value *rad)
Helper function for converting radians to degrees.
Definition: sensor.h:1030
sensor_trigger_type
Sensor trigger types.
Definition: sensor.h:213
sensor_attribute
Sensor attribute types.
Definition: sensor.h:284
int(* sensor_attr_set_t)(const struct device *dev, enum sensor_channel chan, enum sensor_attribute attr, const struct sensor_value *val)
Callback API upon setting a sensor's attributes.
Definition: sensor.h:364
int sensor_get_decoder(const struct device *dev, const struct sensor_decoder_api **decoder)
Get the sensor's decoder API.
int(* sensor_sample_fetch_t)(const struct device *dev, enum sensor_channel chan)
Callback API for fetching data from a sensor.
Definition: sensor.h:395
static void sensor_ug_to_ms2(int32_t ug, struct sensor_value *ms2)
Helper function to convert acceleration from micro Gs to m/s^2.
Definition: sensor.h:1017
static double sensor_value_to_double(const struct sensor_value *val)
Helper function for converting struct sensor_value to double.
Definition: sensor.h:1089
static float sensor_value_to_float(const struct sensor_value *val)
Helper function for converting struct sensor_value to float.
Definition: sensor.h:1100
static int sensor_read(struct rtio_iodev *iodev, struct rtio *ctx, void *userdata)
Read data from a sensor.
Definition: sensor.h:907
static void sensor_degrees_to_rad(int32_t d, struct sensor_value *rad)
Helper function for converting degrees to radians.
Definition: sensor.h:1047
static int32_t sensor_ms2_to_ug(const struct sensor_value *ms2)
Helper function to convert acceleration from m/s^2 to micro Gs.
Definition: sensor.h:1004
int(* sensor_attr_get_t)(const struct device *dev, enum sensor_channel chan, enum sensor_attribute attr, struct sensor_value *val)
Callback API upon getting a sensor's attributes.
Definition: sensor.h:375
int sensor_natively_supported_channel_size_info(enum sensor_channel channel, size_t *base_size, size_t *frame_size)
static int sensor_value_from_float(struct sensor_value *val, float inp)
Helper function for converting float to struct sensor_value.
Definition: sensor.h:1137
void(* sensor_trigger_handler_t)(const struct device *dev, const struct sensor_trigger *trigger)
Callback API upon firing of a trigger.
Definition: sensor.h:355
static void sensor_g_to_ms2(int32_t g, struct sensor_value *ms2)
Helper function to convert acceleration from Gs to m/s^2.
Definition: sensor.h:990
static int64_t sensor_value_to_milli(const struct sensor_value *val)
Helper function for converting struct sensor_value to integer milli units.
Definition: sensor.h:1243
#define SENSOR_PI
The value of constant PI in micros.
Definition: sensor.h:963
static int sensor_trigger_set(const struct device *dev, const struct sensor_trigger *trig, sensor_trigger_handler_t handler)
Activate a sensor's trigger and set the trigger handler.
Definition: sensor.h:681
int sensor_reconfigure_read_iodev(struct rtio_iodev *iodev, const struct device *sensor, const enum sensor_channel *channels, size_t num_channels)
Reconfigure a reading iodev.
void(* sensor_processing_callback_t)(int result, uint8_t *buf, uint32_t buf_len, void *userdata)
Callback function used with the helper processing function.
Definition: sensor.h:937
static int64_t sensor_value_to_micro(const struct sensor_value *val)
Helper function for converting struct sensor_value to integer micro units.
Definition: sensor.h:1254
int sensor_channel_get(const struct device *dev, enum sensor_channel chan, struct sensor_value *val)
Get a reading from a sensor device.
int sensor_sample_fetch(const struct device *dev)
Fetch a sample from the sensor and store it in an internal driver buffer.
sensor_channel
Sensor channels.
Definition: sensor.h:59
int(* sensor_get_decoder_t)(const struct device *dev, const struct sensor_decoder_api **api)
Get the decoder associate with the given device.
Definition: sensor.h:538
static void sensor_10udegrees_to_rad(int32_t d, struct sensor_value *rad)
Helper function for converting 10 micro degrees to radians.
Definition: sensor.h:1077
int(* sensor_channel_get_t)(const struct device *dev, enum sensor_channel chan, struct sensor_value *val)
Callback API for getting a reading from a sensor.
Definition: sensor.h:403
static int32_t sensor_ms2_to_g(const struct sensor_value *ms2)
Helper function to convert acceleration from m/s^2 to Gs.
Definition: sensor.h:973
int(* sensor_submit_t)(const struct device *sensor, struct rtio_iodev_sqe *sqe)
Definition: sensor.h:577
void sensor_processing_with_callback(struct rtio *ctx, sensor_processing_callback_t cb)
Helper function for common processing of sensor data.
int(* sensor_trigger_set_t)(const struct device *dev, const struct sensor_trigger *trig, sensor_trigger_handler_t handler)
Callback API for setting a sensor's trigger and handler.
Definition: sensor.h:386
int sensor_sample_fetch_chan(const struct device *dev, enum sensor_channel type)
Fetch a sample from the sensor and store it in an internal driver buffer.
static int32_t sensor_rad_to_10udegrees(const struct sensor_value *rad)
Helper function for converting radians to 10 micro degrees.
Definition: sensor.h:1064
int sensor_attr_get(const struct device *dev, enum sensor_channel chan, enum sensor_attribute attr, struct sensor_value *val)
Get an attribute for a sensor.
static int sensor_value_from_double(struct sensor_value *val, double inp)
Helper function for converting double to struct sensor_value.
Definition: sensor.h:1112
int sensor_attr_set(const struct device *dev, enum sensor_channel chan, enum sensor_attribute attr, const struct sensor_value *val)
Set an attribute for a sensor.
@ SENSOR_TRIG_DELTA
Trigger fires when the selected channel varies significantly.
Definition: sensor.h:229
@ SENSOR_TRIG_NEAR_FAR
Trigger fires when a near/far event is detected.
Definition: sensor.h:231
@ SENSOR_TRIG_FREEFALL
Trigger fires when a free fall is detected.
Definition: sensor.h:247
@ SENSOR_TRIG_PRIV_START
This and higher values are sensor specific.
Definition: sensor.h:263
@ SENSOR_TRIG_MOTION
Trigger fires when motion is detected.
Definition: sensor.h:250
@ SENSOR_TRIG_STATIONARY
Trigger fires when no motion has been detected for a while.
Definition: sensor.h:253
@ SENSOR_TRIG_COMMON_COUNT
Number of all common sensor triggers.
Definition: sensor.h:257
@ SENSOR_TRIG_THRESHOLD
Trigger fires when channel reading transitions configured thresholds.
Definition: sensor.h:238
@ SENSOR_TRIG_MAX
Maximum value describing a sensor trigger type.
Definition: sensor.h:268
@ SENSOR_TRIG_DOUBLE_TAP
Trigger fires when a double tap is detected.
Definition: sensor.h:244
@ SENSOR_TRIG_TIMER
Timer-based trigger, useful when the sensor does not have an interrupt line.
Definition: sensor.h:218
@ SENSOR_TRIG_TAP
Trigger fires when a single tap is detected.
Definition: sensor.h:241
@ SENSOR_TRIG_DATA_READY
Trigger fires whenever new data is ready.
Definition: sensor.h:220
@ SENSOR_ATTR_HYSTERESIS
Definition: sensor.h:302
@ SENSOR_ATTR_FEATURE_MASK
Enable/disable sensor features.
Definition: sensor.h:322
@ SENSOR_ATTR_CALIB_TARGET
Calibration target.
Definition: sensor.h:316
@ SENSOR_ATTR_OFFSET
The sensor value returned will be altered by the amount indicated by offset: final_value = sensor_val...
Definition: sensor.h:311
@ SENSOR_ATTR_OVERSAMPLING
Oversampling factor.
Definition: sensor.h:304
@ SENSOR_ATTR_FF_DUR
Free-fall duration represented in milliseconds.
Definition: sensor.h:330
@ SENSOR_ATTR_UPPER_THRESH
Upper threshold for trigger.
Definition: sensor.h:293
@ SENSOR_ATTR_CONFIGURATION
Configure the operating modes of a sensor.
Definition: sensor.h:318
@ SENSOR_ATTR_CALIBRATION
Set a calibration value needed by a sensor.
Definition: sensor.h:320
@ SENSOR_ATTR_COMMON_COUNT
Number of all common sensor attributes.
Definition: sensor.h:334
@ SENSOR_ATTR_ALERT
Alert threshold or alert enable/disable.
Definition: sensor.h:324
@ SENSOR_ATTR_SLOPE_TH
Threshold for any-motion (slope) trigger.
Definition: sensor.h:295
@ SENSOR_ATTR_SAMPLING_FREQUENCY
Sensor sampling frequency, i.e.
Definition: sensor.h:289
@ SENSOR_ATTR_FULL_SCALE
Sensor range, in SI units.
Definition: sensor.h:306
@ SENSOR_ATTR_LOWER_THRESH
Lower threshold for trigger.
Definition: sensor.h:291
@ SENSOR_ATTR_SLOPE_DUR
Duration for which the slope values needs to be outside the threshold for the trigger to fire.
Definition: sensor.h:300
@ SENSOR_ATTR_MAX
Maximum value describing a sensor attribute type.
Definition: sensor.h:345
@ SENSOR_ATTR_PRIV_START
This and higher values are sensor specific.
Definition: sensor.h:340
@ SENSOR_CHAN_GAUGE_STATE_OF_HEALTH
State of health measurement in %.
Definition: sensor.h:176
@ SENSOR_CHAN_PM_1_0
1.0 micro-meters Particulate Matter, in ug/m^3
Definition: sensor.h:111
@ SENSOR_CHAN_DIE_TEMP
Device die temperature in degrees Celsius.
Definition: sensor.h:85
@ SENSOR_CHAN_PRESS
Pressure in kilopascal.
Definition: sensor.h:89
@ SENSOR_CHAN_GAUGE_TIME_TO_FULL
Time to full in minutes.
Definition: sensor.h:180
@ SENSOR_CHAN_ACCEL_XYZ
Acceleration on the X, Y and Z axes.
Definition: sensor.h:67
@ SENSOR_CHAN_MAGN_X
Magnetic field on the X axis, in Gauss.
Definition: sensor.h:77
@ SENSOR_CHAN_CURRENT
Current, in amps.
Definition: sensor.h:133
@ SENSOR_CHAN_GYRO_XYZ
Angular velocity around the X, Y and Z axes.
Definition: sensor.h:75
@ SENSOR_CHAN_VSHUNT
Current Shunt Voltage in milli-volts.
Definition: sensor.h:130
@ SENSOR_CHAN_GREEN
Illuminance in green spectrum, in lux.
Definition: sensor.h:104
@ SENSOR_CHAN_MAGN_Z
Magnetic field on the Z axis, in Gauss.
Definition: sensor.h:81
@ SENSOR_CHAN_MAGN_Y
Magnetic field on the Y axis, in Gauss.
Definition: sensor.h:79
@ SENSOR_CHAN_GAUGE_DESIRED_VOLTAGE
Desired voltage of cell in V (nominal voltage)
Definition: sensor.h:186
@ SENSOR_CHAN_POWER
Power in watts.
Definition: sensor.h:135
@ SENSOR_CHAN_PM_2_5
2.5 micro-meters Particulate Matter, in ug/m^3
Definition: sensor.h:113
@ SENSOR_CHAN_RESISTANCE
Resistance , in Ohm.
Definition: sensor.h:138
@ SENSOR_CHAN_GAUGE_AVG_CURRENT
Average current, in amps.
Definition: sensor.h:156
@ SENSOR_CHAN_GYRO_Y
Angular velocity around the Y axis, in radians/s.
Definition: sensor.h:71
@ SENSOR_CHAN_GAUGE_DESIRED_CHARGING_CURRENT
Desired charging current in mA.
Definition: sensor.h:188
@ SENSOR_CHAN_GAUGE_FULL_CHARGE_CAPACITY
Full Charge Capacity in mAh.
Definition: sensor.h:166
@ SENSOR_CHAN_ROTATION
Angular rotation, in degrees.
Definition: sensor.h:141
@ SENSOR_CHAN_AMBIENT_TEMP
Ambient temperature in degrees Celsius.
Definition: sensor.h:87
@ SENSOR_CHAN_MAGN_XYZ
Magnetic field on the X, Y and Z axes.
Definition: sensor.h:83
@ SENSOR_CHAN_GAUGE_STDBY_CURRENT
Standby current, in amps.
Definition: sensor.h:158
@ SENSOR_CHAN_GAUGE_MAX_LOAD_CURRENT
Max load current, in amps.
Definition: sensor.h:160
@ SENSOR_CHAN_ACCEL_Y
Acceleration on the Y axis, in m/s^2.
Definition: sensor.h:63
@ SENSOR_CHAN_RPM
Revolutions per minute, in RPM.
Definition: sensor.h:151
@ SENSOR_CHAN_GAUGE_FULL_AVAIL_CAPACITY
Full Available Capacity in mAh.
Definition: sensor.h:172
@ SENSOR_CHAN_VOLTAGE
Voltage, in volts.
Definition: sensor.h:127
@ SENSOR_CHAN_BLUE
Illuminance in blue spectrum, in lux.
Definition: sensor.h:106
@ SENSOR_CHAN_LIGHT
Illuminance in visible spectrum, in lux.
Definition: sensor.h:98
@ SENSOR_CHAN_GAUGE_DESIGN_VOLTAGE
Design voltage of cell in V (max voltage)
Definition: sensor.h:184
@ SENSOR_CHAN_ACCEL_Z
Acceleration on the Z axis, in m/s^2.
Definition: sensor.h:65
@ SENSOR_CHAN_CO2
CO2 level, in parts per million (ppm)
Definition: sensor.h:120
@ SENSOR_CHAN_GAUGE_STATE_OF_CHARGE
State of charge measurement in %.
Definition: sensor.h:164
@ SENSOR_CHAN_GAUGE_CYCLE_COUNT
Cycle count (total number of charge/discharge cycles)
Definition: sensor.h:182
@ SENSOR_CHAN_GAUGE_TEMP
Gauge temperature
Definition: sensor.h:162
@ SENSOR_CHAN_POS_DY
Position change on the Y axis, in points.
Definition: sensor.h:146
@ SENSOR_CHAN_GYRO_Z
Angular velocity around the Z axis, in radians/s.
Definition: sensor.h:73
@ SENSOR_CHAN_POS_DX
Position change on the X axis, in points.
Definition: sensor.h:144
@ SENSOR_CHAN_GAUGE_AVG_POWER
Average power in mW.
Definition: sensor.h:174
@ SENSOR_CHAN_GAUGE_TIME_TO_EMPTY
Time to empty in minutes.
Definition: sensor.h:178
@ SENSOR_CHAN_PM_10
10 micro-meters Particulate Matter, in ug/m^3
Definition: sensor.h:115
@ SENSOR_CHAN_GAUGE_REMAINING_CHARGE_CAPACITY
Remaining Charge Capacity in mAh.
Definition: sensor.h:168
@ SENSOR_CHAN_ALL
All channels.
Definition: sensor.h:191
@ SENSOR_CHAN_GAUGE_VOLTAGE
Voltage, in volts.
Definition: sensor.h:154
@ SENSOR_CHAN_PROX
Proximity.
Definition: sensor.h:94
@ SENSOR_CHAN_COMMON_COUNT
Number of all common sensor channels.
Definition: sensor.h:196
@ SENSOR_CHAN_PRIV_START
This and higher values are sensor specific.
Definition: sensor.h:202
@ SENSOR_CHAN_GYRO_X
Angular velocity around the X axis, in radians/s.
Definition: sensor.h:69
@ SENSOR_CHAN_GAS_RES
Gas sensor resistance in ohms.
Definition: sensor.h:124
@ SENSOR_CHAN_HUMIDITY
Humidity, in percent.
Definition: sensor.h:96
@ SENSOR_CHAN_DISTANCE
Distance.
Definition: sensor.h:117
@ SENSOR_CHAN_IR
Illuminance in infra-red spectrum, in lux.
Definition: sensor.h:100
@ SENSOR_CHAN_MAX
Maximum value describing a sensor channel type.
Definition: sensor.h:207
@ SENSOR_CHAN_POS_DZ
Position change on the Z axis, in points.
Definition: sensor.h:148
@ SENSOR_CHAN_RED
Illuminance in red spectrum, in lux.
Definition: sensor.h:102
@ SENSOR_CHAN_ALTITUDE
Altitude, in meters.
Definition: sensor.h:108
@ SENSOR_CHAN_GAUGE_NOM_AVAIL_CAPACITY
Nominal Available Capacity in mAh.
Definition: sensor.h:170
@ SENSOR_CHAN_ACCEL_X
Acceleration on the X axis, in m/s^2.
Definition: sensor.h:61
@ SENSOR_CHAN_VOC
VOC level, in parts per billion (ppb)
Definition: sensor.h:122
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition: util_macro.h:124
#define ENOSYS
Function not implemented.
Definition: errno.h:83
#define ENOMEM
Not enough core.
Definition: errno.h:51
#define ERANGE
Result too large.
Definition: errno.h:73
#define INT64_C(x)
Definition: llvm.h:86
Real-Time IO device API for moving bytes with low effort.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__INT32_TYPE__ int32_t
Definition: stdint.h:74
#define INT32_MAX
Definition: stdint.h:18
__UINT64_TYPE__ uint64_t
Definition: stdint.h:91
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
#define INT16_MAX
Definition: stdint.h:17
__INT64_TYPE__ int64_t
Definition: stdint.h:75
__INT8_TYPE__ int8_t
Definition: stdint.h:72
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
Runtime device structure (in ROM) per driver instance.
Definition: device.h:381
const void * api
Address of the API structure exposed by the device instance.
Definition: device.h:387
API that an RTIO IO device should implement.
Definition: rtio.h:429
Compute the mempool block index for a given pointer.
Definition: rtio.h:419
struct rtio_sqe sqe
Definition: rtio.h:420
An IO device with a function table for submitting requests.
Definition: rtio.h:444
void * data
Definition: rtio.h:452
A submission queue event.
Definition: rtio.h:230
void * userdata
User provided data which is returned upon operation completion.
Definition: rtio.h:250
uint8_t * buf
Buffer to use.
Definition: rtio.h:257
uint32_t buf_len
Length of buffer.
Definition: rtio.h:256
const struct rtio_iodev * iodev
Device to operation on.
Definition: rtio.h:241
An RTIO context containing what can be viewed as a pair of queues.
Definition: rtio.h:323
Definition: sensor.h:796
uint64_t timestamp_ns
Definition: sensor.h:798
int8_t shift
Definition: sensor.h:807
uint32_t num_channels
Definition: sensor.h:804
Used for iterating over the data frames via the sensor_decoder_api.
Definition: sensor.h:495
const struct sensor_decoder_api * decoder
Definition: sensor.h:496
const uint8_t * buffer
Definition: sensor.h:497
size_t channel_idx
Definition: sensor.h:499
enum sensor_channel channel
Definition: sensor.h:498
uint32_t fit
Definition: sensor.h:500
Decodes a single raw data buffer.
Definition: sensor.h:413
int(* get_size_info)(enum sensor_channel channel, size_t *base_size, size_t *frame_size)
Get the size required to decode a given channel.
Definition: sensor.h:439
int(* decode)(const uint8_t *buffer, enum sensor_channel channel, size_t channel_idx, uint32_t *fit, uint16_t max_count, void *data_out)
Decode up to max_count samples from the buffer.
Definition: sensor.h:467
int(* get_frame_count)(const uint8_t *buffer, enum sensor_channel channel, size_t channel_idx, uint16_t *frame_count)
Get the number of frames in the current buffer.
Definition: sensor.h:424
Definition: sensor.h:585
sensor_get_decoder_t get_decoder
Definition: sensor.h:591
sensor_attr_set_t attr_set
Definition: sensor.h:586
sensor_attr_get_t attr_get
Definition: sensor.h:587
sensor_trigger_set_t trigger_set
Definition: sensor.h:588
sensor_sample_fetch_t sample_fetch
Definition: sensor.h:589
sensor_channel_get_t channel_get
Definition: sensor.h:590
sensor_submit_t submit
Definition: sensor.h:592
Definition: sensor.h:545
size_t count
Definition: sensor.h:548
const struct device * sensor
Definition: sensor.h:546
const size_t max
Definition: sensor.h:549
enum sensor_channel *const channels
Definition: sensor.h:547
Sensor trigger spec.
Definition: sensor.h:274
enum sensor_trigger_type type
Trigger type.
Definition: sensor.h:276
enum sensor_channel chan
Channel the trigger is set on.
Definition: sensor.h:278
Representation of a sensor readout value.
Definition: sensor.h:49
int32_t val2
Fractional part of the value (in one-millionth parts).
Definition: sensor.h:53
int32_t val1
Integer part of the value.
Definition: sensor.h:51