diff options
author | Rocco Marco Guglielmi <roccomarco.guglielmi@gmail.com> | 2018-03-09 23:45:17 +0000 |
---|---|---|
committer | Rocco Marco Guglielmi <roccomarco.guglielmi@gmail.com> | 2018-03-09 23:45:17 +0000 |
commit | 8887dbbde2e35d3ed21a8b5cee9be2a68bfe900c (patch) | |
tree | 74977e8385b1b05467df40b0c7fa5a9f2c435118 /os/ex/ST/hts221.h | |
parent | 6f6cad8190e851bd31d8b0e8d9a92d0207939e73 (diff) | |
download | ChibiOS-8887dbbde2e35d3ed21a8b5cee9be2a68bfe900c.tar.gz ChibiOS-8887dbbde2e35d3ed21a8b5cee9be2a68bfe900c.tar.bz2 ChibiOS-8887dbbde2e35d3ed21a8b5cee9be2a68bfe900c.zip |
Updated HTS221 Driver and related demo
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11678 110e8d01-0319-4d1e-a829-52ad28d1bb01
Diffstat (limited to 'os/ex/ST/hts221.h')
-rw-r--r-- | os/ex/ST/hts221.h | 398 |
1 files changed, 315 insertions, 83 deletions
diff --git a/os/ex/ST/hts221.h b/os/ex/ST/hts221.h index 9f47aaea4..c6e595fb7 100644 --- a/os/ex/ST/hts221.h +++ b/os/ex/ST/hts221.h @@ -1,5 +1,5 @@ /*
- ChibiOS - Copyright (C) 2016 Rocco Marco Guglielmi
+ ChibiOS - Copyright (C) 2016-2018 Rocco Marco Guglielmi
This file is part of ChibiOS.
@@ -44,7 +44,7 @@ /**
* @brief HTS221 driver version string.
*/
-#define EX_HTS221_VERSION "1.0.1"
+#define EX_HTS221_VERSION "1.0.2"
/**
* @brief HTS221 driver version major number.
@@ -59,22 +59,33 @@ /**
* @brief HTS221 driver version patch number.
*/
-#define EX_HTS221_PATCH 1
+#define EX_HTS221_PATCH 2
/** @} */
/**
- * @brief HTS221 characteristics.
+ * @brief HTS221 hygrometer subsystem characteristics.
+ * @note Sensitivity is expressed as %rH/LSB whereas %rH stand for percentage
+ * of relative humidity.
*
* @{
*/
#define HTS221_HYGRO_NUMBER_OF_AXES 1U
-#define HTS221_THERMO_NUMBER_OF_AXES 1U
-#define HTS221_HYGRO_SENS 256.0f /**< LSB/%rH */
-#define HTS221_THERMO_SENS 64.0f /**< LSB/°C */
+#define HTS221_HYGRO_SENS 0.00390625f
/** @} */
/**
+ * @brief HTS221 thermometer subsystem characteristics.
+ * @note Sensitivity is expressed as °C/LSB whereas.
+ *
+ * @{
+ */
+#define HTS221_THERMO_NUMBER_OF_AXES 1U
+
+#define HTS221_THERMO_SENS 00015625f
+/** @} */
+
+/**
* @name HTS221 communication interfaces related bit masks
* @{
*/
@@ -154,7 +165,7 @@ /** @} */
/*===========================================================================*/
-/* Driver pre-compile time settings. */
+/* Driver pre-thermoile time settings. */
/*===========================================================================*/
/**
@@ -194,7 +205,7 @@ * on each transaction.
* @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION
*/
-#if !defined(HTS221_SHARED_SPI) || defined(__DOXYGEN__)
+#if !defined(HTS221_SHARED_I2C) || defined(__DOXYGEN__)
#define HTS221_SHARED_I2C FALSE
#endif
/** @} */
@@ -223,10 +234,6 @@ #error "HTS221_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION"
#endif
-/*
- * TODO: Add SPI support.
- */
-
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
@@ -236,6 +243,11 @@ * @{
*/
/**
+ * @brief Structure representing a HTS221 driver.
+ */
+typedef struct HTS221Driver HTS221Driver;
+
+/**
* @brief HTS221 output data rate and bandwidth.
*/
typedef enum {
@@ -316,17 +328,21 @@ typedef struct { const I2CConfig *i2ccfg;
#endif /* HTS221_USE_I2C */
/**
- * @brief HTS221 initial sensitivity.
- * @note Value are respectively related to hygrometer
- * and thermometer.
+ * @brief HTS221 hygrometer subsystem initial sensitivity.
+ */
+ float *hygrosensitivity;
+ /**
+ * @brief HTS221 hygrometer subsystem initial bias.
+ */
+ float *hygrobias;
+ /**
+ * @brief HTS221 thermometer subsystem initial sensitivity.
*/
- float* sensitivity;
+ float *thermosensitivity;
/**
- * @brief HTS221 initial bias.
- * @note Value are respectively related to hygrometer
- * and thermometer.
+ * @brief HTS221 thermometer subsystem initial bias.
*/
- float* bias;
+ float *thermobias;
/**
* @brief HTS221 output data rate selection.
*/
@@ -337,104 +353,320 @@ typedef struct { */
hts221_bdu_t blockdataupdate;
/**
- * @brief HTS221 humidity resolution.
+ * @brief HTS221 hygrometer subsystem resolution.
*/
- hts221_avgh_t reshumidity;
+ hts221_avgh_t hygroresolution;
/**
- * @brief HTS221 temperature resolution.
+ * @brief HTS221 thermometer subsystem resolution.
*/
- hts221_avgt_t restemperature;
+ hts221_avgt_t thermoresolution;
#endif
} HTS221Config;
/**
- * @brief @p HTS221 hygrometer subsystem specific methods.
+ * @brief @p HTS221 specific methods.
* @note No methods so far, just a common ancestor interface.
*/
-#define _hts221_hygrometer_methods_alone
+#define _hts221_methods_alone
/**
- * @brief @p HTS221 hygrometer subsystem specific methods with inherited ones.
+ * @brief @p HTS221 specific methods with inherited ones.
*/
-#define _hts221_hygrometer_methods \
- _base_hygrometer_methods \
- _hts221_hygrometer_methods_alone
+#define _hts221_methods \
+ _base_object_methods \
+ _hts221_methods_alone
/**
- * @brief @p HTS221 thermometer subsystem specific methods.
- * @note No methods so far, just a common ancestor interface.
+ * @extends BaseObjectVMT
+ *
+ * @brief @p HTS221 virtual methods table.
*/
-#define _hts221_thermometer_methods_alone
-
+struct HTS221VMT {
+ _hts221_methods
+};
+
/**
- * @brief @p HTS221 compass subsystem specific methods with inherited ones.
+ * @brief @p HTS221Driver specific data.
+ */
+#define _hts221_data \
+ /* Driver state.*/ \
+ hts221_state_t state; \
+ /* Current configuration data.*/ \
+ const HTS221Config *config; \
+ /* Hygrometer subsystem axes number.*/ \
+ size_t hygroaxes; \
+ /* Hygrometer subsystem current sensitivity.*/ \
+ float hygrosensitivity; \
+ /* Hygrometer subsystem current bias .*/ \
+ float hygrobias; \
+ /* Hygrometer subsystem factory sensitivity.*/ \
+ float hygrofactorysensitivity; \
+ /* Hygrometer subsystem factory bias .*/ \
+ float hygrofactorybias; \
+ /* Thermometer subsystem axes number.*/ \
+ size_t thermoaxes; \
+ /* Thermometer subsystem current sensitivity.*/ \
+ float thermosensitivity; \
+ /* Thermometer subsystem current bias.*/ \
+ float thermobias; \
+ /* Thermometer subsystem factory sensitivity.*/ \
+ float thermofactorysensitivity; \
+ /* Thermometer subsystem factory bias.*/ \
+ float thermofactorybias;
+
+/**
+ * @brief HTS221 2-axis hygrometer/thermometer class.
*/
-#define _hts221_thermometer_methods \
- _base_thermometer_methods \
- _hts221_thermometer_methods_alone
+struct HTS221Driver {
+ /** @brief Virtual Methods Table.*/
+ const struct HTS221VMT *vmt;
+ /** @brief Base hygrometer interface.*/
+ BaseHygrometer hygro_if;
+ /** @brief Base thermometer interface.*/
+ BaseThermometer thermo_if;
+ _hts221_data
+};
+/** @} */
+
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
/**
- * @extends BaseHygrometerVMT
+ * @brief Return the number of axes of the BaseHygrometer.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ *
+ * @return the number of axes.
*
- * @brief @p HTS221 hygrometer virtual methods table.
+ * @api
*/
-struct HTS221HygrometerVMT {
- _hts221_hygrometer_methods
-};
+#define hts221HygrometerGetAxesNumber(devp) \
+ hygrometerGetAxesNumber(&((devp)->hygro_if))
/**
- * @extends BaseThermometerVMT
+ * @brief Retrieves raw data from the BaseHygrometer.
+ * @note This data is retrieved from MEMS register without any algebraical
+ * manipulation.
+ * @note The axes array must be at least the same size of the
+ * BaseHygrometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[out] axes a buffer which would be filled with raw data.
*
- * @brief @p HTS221 thermometer virtual methods table.
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ * @retval MSG_RESET if one or more I2C errors occurred, the errors can
+ * be retrieved using @p i2cGetErrors().
+ * @retval MSG_TIMEOUT if a timeout occurred before operation end.
+ *
+ * @api
*/
-struct HTS221ThermometerVMT {
- _hts221_thermometer_methods
-};
+#define hts221HygrometerReadRaw(devp, axes) \
+ hygrometerReadRaw(&((devp)->hygro_if), axes)
/**
- * @brief @p HTS221Driver specific data.
+ * @brief Retrieves cooked data from the BaseHygrometer.
+ * @note This data is manipulated according to the formula
+ * cooked = (raw * sensitivity) - bias.
+ * @note Final data is expressed as %rH.
+ * @note The axes array must be at least the same size of the
+ * BaseHygrometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[out] axes a buffer which would be filled with cooked data.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ * @retval MSG_RESET if one or more I2C errors occurred, the errors can
+ * be retrieved using @p i2cGetErrors().
+ * @retval MSG_TIMEOUT if a timeout occurred before operation end.
+ *
+ * @api
*/
-#define _hts221_data \
- /* Driver state.*/ \
- hts221_state_t state; \
- /* Current configuration data.*/ \
- const HTS221Config *config; \
- /* Current sensitivity data.*/ \
- float sensitivity[HTS221_HYGRO_NUMBER_OF_AXES + \
- HTS221_THERMO_NUMBER_OF_AXES]; \
- /* Current Bias data.*/ \
- float bias[HTS221_HYGRO_NUMBER_OF_AXES + \
- HTS221_THERMO_NUMBER_OF_AXES];
+#define hts221HygrometerReadCooked(devp, axes) \
+ hygrometerReadCooked(&((devp)->hygro_if), axes)
/**
- * @extends BaseHygrometer
+ * @brief Set bias values for the BaseHygrometer.
+ * @note Bias must be expressed as %rH.
+ * @note The bias buffer must be at least the same size of the
+ * BaseHygrometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[in] bp a buffer which contains biases.
*
- * @brief HTS221 3-axis barometer class.
- * @details This class extends @p BaseHygrometer by adding physical
- * driver implementation.
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
*/
-struct HTS221Driver {
- /** @brief BaseSensor Virtual Methods Table. */
- const struct BaseSensorVMT *vmt_sensor;
- _base_sensor_data
- /** @brief HTS221 Hygrometer Virtual Methods Table. */
- const struct HTS221HygrometerVMT *vmt_hygrometer;
- _base_hygrometer_data
- /** @brief HTS221 Thermometer Virtual Methods Table. */
- const struct HTS221ThermometerVMT *vmt_thermometer;
- _base_thermometer_data
- _hts221_data
-};
+#define hts221HygrometerSetBias(devp, bp) \
+ hygrometerSetBias(&((devp)->hygro_if), bp)
/**
- * @brief Structure representing a HTS221 driver.
+ * @brief Reset bias values for the BaseHygrometer.
+ * @note Default biases value are obtained from device datasheet when
+ * available otherwise they are considered zero.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
*/
-typedef struct HTS221Driver HTS221Driver;
-/** @} */
+#define hts221HygrometerResetBias(devp) \
+ hygrometerResetBias(&((devp)->hygro_if))
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
+/**
+ * @brief Set sensitivity values for the BaseHygrometer.
+ * @note Sensitivity must be expressed as %rH/LSB.
+ * @note The sensitivity buffer must be at least the same size of the
+ * BaseHygrometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[in] sp a buffer which contains sensitivities.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
+ */
+#define hts221HygrometerSetSensitivity(devp, sp) \
+ hygrometerSetSensitivity(&((devp)->hygro_if), sp)
+
+/**
+ * @brief Reset sensitivity values for the BaseHygrometer.
+ * @note Default sensitivities value are obtained from device datasheet.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
+ */
+#define hts221HygrometerResetSensitivity(devp) \
+ hygrometerResetSensitivity(&((devp)->hygro_if))
+
+/**
+ * @brief Return the number of axes of the BaseThermometer.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ *
+ * @return the number of axes.
+ *
+ * @api
+ */
+#define hts221ThermometerGetAxesNumber(devp) \
+ thermometerGetAxesNumber(&((devp)->thermo_if))
+
+/**
+ * @brief Retrieves raw data from the BaseThermometer.
+ * @note This data is retrieved from MEMS register without any algebraical
+ * manipulation.
+ * @note The axes array must be at least the same size of the
+ * BaseThermometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[out] axes a buffer which would be filled with raw data.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ * @retval MSG_RESET if one or more I2C errors occurred, the errors can
+ * be retrieved using @p i2cGetErrors().
+ * @retval MSG_TIMEOUT if a timeout occurred before operation end.
+ *
+ * @api
+ */
+#define hts221ThermometerReadRaw(devp, axes) \
+ thermometerReadRaw(&((devp)->thermo_if), axes)
+
+/**
+ * @brief Retrieves cooked data from the BaseThermometer.
+ * @note This data is manipulated according to the formula
+ * cooked = (raw * sensitivity) - bias.
+ * @note Final data is expressed as °C.
+ * @note The axes array must be at least the same size of the
+ * BaseThermometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[out] axes a buffer which would be filled with cooked data.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ * @retval MSG_RESET if one or more I2C errors occurred, the errors can
+ * be retrieved using @p i2cGetErrors().
+ * @retval MSG_TIMEOUT if a timeout occurred before operation end.
+ *
+ * @api
+ */
+#define hts221ThermometerReadCooked(devp, axes) \
+ thermometerReadCooked(&((devp)->thermo_if), axes)
+
+/**
+ * @brief Set bias values for the BaseThermometer.
+ * @note Bias must be expressed as °C.
+ * @note The bias buffer must be at least the same size of the
+ * BaseThermometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[in] bp a buffer which contains biases.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
+ */
+#define hts221ThermometerSetBias(devp, bp) \
+ thermometerSetBias(&((devp)->thermo_if), bp)
+
+/**
+ * @brief Reset bias values for the BaseThermometer.
+ * @note Default biases value are obtained from device datasheet when
+ * available otherwise they are considered zero.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
+ */
+#define hts221ThermometerResetBias(devp) \
+ thermometerResetBias(&((devp)->thermo_if))
+
+/**
+ * @brief Set sensitivity values for the BaseThermometer.
+ * @note Sensitivity must be expressed as °C/LSB.
+ * @note The sensitivity buffer must be at least the same size of the
+ * BaseThermometer axes number.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ * @param[in] sp a buffer which contains sensitivities.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
+ */
+#define hts221ThermometerSetSensitivity(devp, sp) \
+ thermometerSetSensitivity(&((devp)->thermo_if), sp)
+
+/**
+ * @brief Reset sensitivity values for the BaseThermometer.
+ * @note Default sensitivities value are obtained from device datasheet.
+ *
+ * @param[in] devp pointer to @p HTS221Driver.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ *
+ * @api
+ */
+#define hts221ThermometerResetSensitivity(devp) \
+ thermometerResetSensitivity(&((devp)->thermo_if))
/*===========================================================================*/
/* External declarations. */
|