doc/hardware/peripherals/sensor/index.rst
.. _sensor:
Sensors #######
The sensor driver API provides functionality to uniformly read, configure, and setup event handling for devices that take real world measurements in meaningful units.
Sensors range from very simple temperature-reading devices that must be polled with a fixed scale to complex devices taking in readings from multitudes of sensors and themselves producing new inferred sensor data such as step counts, presence detection, orientation, and more.
Supporting this wide breadth of devices is a demanding task and the sensor API attempts to provide a uniform interface to them.
.. _sensor-using:
Using Sensors
Using sensors from an application there are some APIs and terms that are helpful
to understand. Sensors in Zephyr are composed of :ref:sensor-channel,
:ref:sensor-attribute, and :ref:sensor-trigger. Attributes and triggers may
be device or channel specific.
.. note::
Getting samples from sensors using the sensor API today can be done in one of
two ways. A stable and long-lived API :ref:sensor-fetch-and-get, or a newer
but rapidly stabilizing API :ref:sensor-read-and-decode. It's expected that
in the near future :ref:sensor-fetch-and-get will be deprecated in favor of
:ref:sensor-read-and-decode. Triggers are handled entirely differently for
:ref:sensor-fetch-and-get or :ref:sensor-read-and-decode and the
differences are noted in each of those sections.
.. toctree:: :maxdepth: 1
attributes.rst channels.rst triggers.rst power_management.rst device_tree.rst fetch_and_get.rst read_and_decode.rst
.. _sensor-implementing:
Implementing Sensor Drivers
.. note::
Implementing the driver side of the sensor API requires an understanding how
the sensor APIs are used. Please read through :ref:sensor-using first!
sensor_sample_fetch_t as a blocking call that
stashes the specified channels (or all sensor channels) as driver instance
data.sensor_channel_get_t without side effects
manipulating driver state returning stashed sensor readings.sensor_trigger_set_t storing the address of the
:c:struct:sensor_trigger rather than copying the contents. This is so
:c:macro:CONTAINER_OF may be used for trigger callback context.sensor_submit_t as a non-blocking call.sensor_submit_t using :ref:rtio to do non-blocking bus transfers if possible.sensor_submit_t using a work queue if
:ref:rtio is unsupported by the bus.sensor_submit_t checking the :c:struct:rtio_sqe
is of type :c:enum:RTIO_SQE_RX (read request).sensor_submit_t checking all requested channels
supported or respond with an error if not.sensor_submit_t checking the provided buffer
is large enough for the requested channels.sensor_submit_t in a way that directly reads into
the provided buffer avoiding copying of any kind, with few exceptions.sensor_decoder_api with pure stateless functions. All state needed to convert the raw sensor readings into
fixed point SI united values must be in the provided buffer.sensor_get_decoder_t returning the
:c:struct:sensor_decoder_api for that device type... _sensor-api-reference:
API Reference
.. doxygengroup:: sensor_interface .. doxygengroup:: sensor_emulator_backend