1 /* 2 * Copyright 2023 Google LLC 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef ZEPHYR_INCLUDE_INPUT_ANALOG_AXIS_H_ 8 #define ZEPHYR_INCLUDE_INPUT_ANALOG_AXIS_H_ 9 10 #include <stdint.h> 11 #include <zephyr/device.h> 12 13 /** 14 * @brief Analog axis API 15 * @defgroup input_analog_axis Analog axis API 16 * @ingroup io_interfaces 17 * @{ 18 */ 19 20 /** 21 * @brief Analog axis calibration data structure. 22 * 23 * Holds the calibration data for a single analog axis. Initial values are set 24 * from the devicetree and can be changed by the applicatoin in runtime using 25 * @ref analog_axis_calibration_set and @ref analog_axis_calibration_get. 26 */ 27 struct analog_axis_calibration { 28 /** Input value that corresponds to the minimum output value. */ 29 int16_t in_min; 30 /** Input value that corresponds to the maximum output value. */ 31 int16_t in_max; 32 /** Input value center deadzone. */ 33 uint16_t in_deadzone; 34 }; 35 36 /** 37 * @brief Analog axis raw data callback. 38 * 39 * @param dev Analog axis device. 40 * @param channel Channel number. 41 * @param raw_val Raw value for the channel. 42 */ 43 typedef void (*analog_axis_raw_data_t)(const struct device *dev, 44 int channel, int16_t raw_val); 45 46 /** 47 * @brief Set a raw data callback. 48 * 49 * Set a callback to receive raw data for the specified analog axis device. 50 * This is meant to be use in the application to acquire the data to use for 51 * calibration. Set cb to NULL to disable the callback. 52 * 53 * @param dev Analog axis device. 54 * @param cb An analog_axis_raw_data_t callback to use, NULL disable. 55 */ 56 void analog_axis_set_raw_data_cb(const struct device *dev, analog_axis_raw_data_t cb); 57 58 /** 59 * @brief Get the number of defined axes. 60 * 61 * @retval n The number of defined axes for dev. 62 */ 63 int analog_axis_num_axes(const struct device *dev); 64 65 /** 66 * @brief Get the axis calibration data. 67 * 68 * @param dev Analog axis device. 69 * @param channel Channel number. 70 * @param cal Pointer to an analog_axis_calibration structure that is going to 71 * get set with the current calibration data. 72 * 73 * @retval 0 If successful. 74 * @retval -EINVAL If the specified channel is not valid. 75 */ 76 int analog_axis_calibration_get(const struct device *dev, 77 int channel, 78 struct analog_axis_calibration *cal); 79 80 /** 81 * @brief Set the axis calibration data. 82 * 83 * @param dev Analog axis device. 84 * @param channel Channel number. 85 * @param cal Pointer to an analog_axis_calibration structure with the new 86 * calibration data 87 * 88 * @retval 0 If successful. 89 * @retval -EINVAL If the specified channel is not valid. 90 */ 91 int analog_axis_calibration_set(const struct device *dev, 92 int channel, 93 struct analog_axis_calibration *cal); 94 95 /** @} */ 96 97 #endif /* ZEPHYR_INCLUDE_INPUT_ANALOG_AXIS_H_ */ 98