From 8887dbbde2e35d3ed21a8b5cee9be2a68bfe900c Mon Sep 17 00:00:00 2001 From: Rocco Marco Guglielmi Date: Fri, 9 Mar 2018 23:45:17 +0000 Subject: Updated HTS221 Driver and related demo git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11678 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/ex/ST/hts221.h | 398 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 315 insertions(+), 83 deletions(-) (limited to 'os/ex/ST/hts221.h') 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,21 +59,32 @@ /** * @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. */ /*===========================================================================*/ @@ -235,6 +242,11 @@ * @name HTS221 data structures and types. * @{ */ +/** + * @brief Structure representing a HTS221 driver. + */ +typedef struct HTS221Driver HTS221Driver; + /** * @brief HTS221 output data rate and bandwidth. */ @@ -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. */ -- cgit v1.2.3