- Renamed test_sths34pf80 to fulltest_sths34pf80 for clarity - Added detailed header comments explaining the sketch demonstrates all sensor settings - Uses sensor default values to provide stable API demonstration without unexpected register changes - Maintains halt-on-error behavior with F() string memory optimization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
964 lines
No EOL
28 KiB
C++
964 lines
No EOL
28 KiB
C++
/*!
|
|
* @file Adafruit_STHS34PF80.cpp
|
|
*
|
|
* @mainpage Adafruit STHS34PF80 infrared sensor library
|
|
*
|
|
* @section intro_sec Introduction
|
|
*
|
|
* This is a library for the STHS34PF80 infrared sensor
|
|
*
|
|
* Designed specifically to work with the Adafruit STHS34PF80 breakout:
|
|
* http://www.adafruit.com/products/
|
|
*
|
|
* These sensors use I2C to communicate, 2 pins are required to interface.
|
|
*
|
|
* Adafruit invests time and resources providing this open source code,
|
|
* please support Adafruit and open-source hardware by purchasing
|
|
* products from Adafruit!
|
|
*
|
|
* @section author Author
|
|
*
|
|
* Written by Ladyada for Adafruit Industries.
|
|
*
|
|
* @section license License
|
|
*
|
|
* MIT license, all text here must be included in any redistribution
|
|
*
|
|
*/
|
|
|
|
#include "Adafruit_STHS34PF80.h"
|
|
|
|
/*!
|
|
* @brief Instantiates a new STHS34PF80 class
|
|
*/
|
|
Adafruit_STHS34PF80::Adafruit_STHS34PF80() {}
|
|
|
|
/*!
|
|
* @brief Cleans up the STHS34PF80
|
|
*/
|
|
Adafruit_STHS34PF80::~Adafruit_STHS34PF80() {
|
|
if (i2c_dev) {
|
|
delete i2c_dev;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* @brief Initializes the hardware and detects a valid STHS34PF80
|
|
* @param i2c_addr I2C address to use
|
|
* @param wire The Wire object to be used for I2C connections
|
|
* @return True if initialization was successful, otherwise false
|
|
*/
|
|
bool Adafruit_STHS34PF80::begin(uint8_t i2c_addr, TwoWire* wire) {
|
|
if (i2c_dev) {
|
|
delete i2c_dev;
|
|
}
|
|
|
|
i2c_dev = new Adafruit_I2CDevice(i2c_addr, wire);
|
|
|
|
if (!i2c_dev->begin()) {
|
|
return false;
|
|
}
|
|
|
|
if (!isConnected()) {
|
|
return false;
|
|
}
|
|
|
|
if (!reset()) {
|
|
return false;
|
|
}
|
|
|
|
// Apply recommended default settings
|
|
if (!setObjAveraging(STHS34PF80_AVG_TMOS_32)) {
|
|
return false;
|
|
}
|
|
|
|
if (!setAmbTempAveraging(STHS34PF80_AVG_T_8)) {
|
|
return false;
|
|
}
|
|
|
|
if (!setBlockDataUpdate(true)) {
|
|
return false;
|
|
}
|
|
|
|
if (!setOutputDataRate(STHS34PF80_ODR_1_HZ)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*!
|
|
* @brief Check if the sensor is connected by reading device ID
|
|
* @return True if device ID matches expected value (0xD3), false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::isConnected() {
|
|
if (!i2c_dev) {
|
|
return false;
|
|
}
|
|
|
|
Adafruit_BusIO_Register chip_id =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_WHO_AM_I, 1);
|
|
|
|
return chip_id.read() == 0xD3;
|
|
}
|
|
|
|
/*!
|
|
* @brief Reset the sensor completely
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::reset() {
|
|
// Reboot OTP memory
|
|
if (!rebootOTPmemory()) {
|
|
return false;
|
|
}
|
|
|
|
// Wait for sensor reset to complete
|
|
delay(5);
|
|
|
|
// Reset the internal algorithm
|
|
if (!algorithmReset()) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*!
|
|
* @brief Set the motion detection low-pass filter configuration
|
|
* @param config The LPF configuration value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setMotionLowPassFilter(
|
|
sths34pf80_lpf_config_t config) {
|
|
Adafruit_BusIO_Register lpf1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_m_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 0);
|
|
|
|
return lpf_m_bits.write(config);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the motion detection low-pass filter configuration
|
|
* @return The current LPF configuration value
|
|
*/
|
|
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getMotionLowPassFilter() {
|
|
Adafruit_BusIO_Register lpf1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_m_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 0);
|
|
|
|
return (sths34pf80_lpf_config_t)lpf_m_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set the motion and presence detection low-pass filter configuration
|
|
* @param config The LPF configuration value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setMotionPresenceLowPassFilter(
|
|
sths34pf80_lpf_config_t config) {
|
|
Adafruit_BusIO_Register lpf1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_p_m_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 3);
|
|
|
|
return lpf_p_m_bits.write(config);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the motion and presence detection low-pass filter configuration
|
|
* @return The current LPF configuration value
|
|
*/
|
|
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getMotionPresenceLowPassFilter() {
|
|
Adafruit_BusIO_Register lpf1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_p_m_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 3);
|
|
|
|
return (sths34pf80_lpf_config_t)lpf_p_m_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set the presence detection low-pass filter configuration
|
|
* @param config The LPF configuration value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setPresenceLowPassFilter(
|
|
sths34pf80_lpf_config_t config) {
|
|
Adafruit_BusIO_Register lpf2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_p_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 3);
|
|
|
|
return lpf_p_bits.write(config);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the presence detection low-pass filter configuration
|
|
* @return The current LPF configuration value
|
|
*/
|
|
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getPresenceLowPassFilter() {
|
|
Adafruit_BusIO_Register lpf2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_p_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 3);
|
|
|
|
return (sths34pf80_lpf_config_t)lpf_p_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set the ambient temperature shock detection low-pass filter
|
|
* configuration
|
|
* @param config The LPF configuration value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setTemperatureLowPassFilter(
|
|
sths34pf80_lpf_config_t config) {
|
|
Adafruit_BusIO_Register lpf2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_a_t_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 0);
|
|
|
|
return lpf_a_t_bits.write(config);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the ambient temperature shock detection low-pass filter
|
|
* configuration
|
|
* @return The current LPF configuration value
|
|
*/
|
|
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getTemperatureLowPassFilter() {
|
|
Adafruit_BusIO_Register lpf2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits lpf_a_t_bits =
|
|
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 0);
|
|
|
|
return (sths34pf80_lpf_config_t)lpf_a_t_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set ambient temperature averaging configuration
|
|
* @param config The averaging configuration value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setAmbTempAveraging(sths34pf80_avg_t_t config) {
|
|
Adafruit_BusIO_Register avg_trim_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits avg_t_bits =
|
|
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 2, 4);
|
|
|
|
return avg_t_bits.write(config);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get ambient temperature averaging configuration
|
|
* @return The current averaging configuration value
|
|
*/
|
|
sths34pf80_avg_t_t Adafruit_STHS34PF80::getAmbTempAveraging() {
|
|
Adafruit_BusIO_Register avg_trim_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits avg_t_bits =
|
|
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 2, 4);
|
|
|
|
return (sths34pf80_avg_t_t)avg_t_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set object temperature averaging configuration
|
|
* @param config The averaging configuration value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setObjAveraging(sths34pf80_avg_tmos_t config) {
|
|
Adafruit_BusIO_Register avg_trim_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits avg_tmos_bits =
|
|
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 3, 0);
|
|
|
|
return avg_tmos_bits.write(config);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get object temperature averaging configuration
|
|
* @return The current averaging configuration value
|
|
*/
|
|
sths34pf80_avg_tmos_t Adafruit_STHS34PF80::getObjAveraging() {
|
|
Adafruit_BusIO_Register avg_trim_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits avg_tmos_bits =
|
|
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 3, 0);
|
|
|
|
return (sths34pf80_avg_tmos_t)avg_tmos_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set wide gain mode configuration
|
|
* @param wide_mode True for wide mode, false for default gain mode
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setWideGainMode(bool wide_mode) {
|
|
Adafruit_BusIO_Register ctrl0_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL0, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits gain_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl0_reg, 3, 4);
|
|
|
|
return gain_bits.write(wide_mode ? 0x00 : 0x07);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get wide gain mode configuration
|
|
* @return True if in wide mode, false if in default gain mode
|
|
*/
|
|
bool Adafruit_STHS34PF80::getWideGainMode() {
|
|
Adafruit_BusIO_Register ctrl0_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL0, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits gain_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl0_reg, 3, 4);
|
|
|
|
return gain_bits.read() == 0x00;
|
|
}
|
|
|
|
/*!
|
|
* @brief Set sensitivity value for ambient temperature compensation
|
|
* @param sensitivity Signed 8-bit sensitivity value (two's complement)
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setSensitivity(int8_t sensitivity) {
|
|
Adafruit_BusIO_Register sens_data_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_SENS_DATA, 1);
|
|
|
|
return sens_data_reg.write((uint8_t)sensitivity);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get sensitivity value for ambient temperature compensation
|
|
* @return Signed 8-bit sensitivity value (two's complement)
|
|
*/
|
|
int8_t Adafruit_STHS34PF80::getSensitivity() {
|
|
Adafruit_BusIO_Register sens_data_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_SENS_DATA, 1);
|
|
|
|
return (int8_t)sens_data_reg.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set block data update configuration
|
|
* @param enable True to enable block data update, false to disable
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setBlockDataUpdate(bool enable) {
|
|
Adafruit_BusIO_Register ctrl1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits bdu_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 1, 4);
|
|
|
|
return bdu_bit.write(enable ? 1 : 0);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get block data update configuration
|
|
* @return True if block data update is enabled, false if disabled
|
|
*/
|
|
bool Adafruit_STHS34PF80::getBlockDataUpdate() {
|
|
Adafruit_BusIO_Register ctrl1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits bdu_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 1, 4);
|
|
|
|
return bdu_bit.read() == 1;
|
|
}
|
|
|
|
/*!
|
|
* @brief Set output data rate configuration with validation
|
|
* Ported from: sths34pf80_tmos_odr_set
|
|
* @param odr The output data rate value
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setOutputDataRate(sths34pf80_odr_t odr) {
|
|
// sths34pf80_ctrl1_t ctrl1;
|
|
// sths34pf80_avg_trim_t avg_trim;
|
|
// sths34pf80_tmos_odr_t max_odr = STHS34PF80_TMOS_ODR_AT_30Hz;
|
|
// int32_t ret;
|
|
if (!i2c_dev) {
|
|
return false;
|
|
}
|
|
|
|
sths34pf80_odr_t max_odr = STHS34PF80_ODR_30_HZ;
|
|
sths34pf80_odr_t current_odr = getOutputDataRate();
|
|
|
|
// ret = sths34pf80_read_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
|
|
// if (ret == 0)
|
|
// {
|
|
// ret = sths34pf80_read_reg(ctx, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim,
|
|
// 1);
|
|
sths34pf80_avg_tmos_t avg_tmos = getObjAveraging();
|
|
|
|
// switch(avg_trim.avg_tmos)
|
|
// {
|
|
switch (avg_tmos) {
|
|
// default:
|
|
// case STHS34PF80_AVG_TMOS_2:
|
|
// case STHS34PF80_AVG_TMOS_8:
|
|
// case STHS34PF80_AVG_TMOS_32:
|
|
// max_odr = STHS34PF80_TMOS_ODR_AT_30Hz;
|
|
// break;
|
|
default:
|
|
case STHS34PF80_AVG_TMOS_2:
|
|
case STHS34PF80_AVG_TMOS_8:
|
|
case STHS34PF80_AVG_TMOS_32:
|
|
max_odr = STHS34PF80_ODR_30_HZ;
|
|
break;
|
|
// case STHS34PF80_AVG_TMOS_128:
|
|
// max_odr = STHS34PF80_TMOS_ODR_AT_8Hz;
|
|
// break;
|
|
case STHS34PF80_AVG_TMOS_128:
|
|
max_odr = STHS34PF80_ODR_8_HZ;
|
|
break;
|
|
// case STHS34PF80_AVG_TMOS_256:
|
|
// max_odr = STHS34PF80_TMOS_ODR_AT_4Hz;
|
|
// break;
|
|
case STHS34PF80_AVG_TMOS_256:
|
|
max_odr = STHS34PF80_ODR_4_HZ;
|
|
break;
|
|
// case STHS34PF80_AVG_TMOS_512:
|
|
// max_odr = STHS34PF80_TMOS_ODR_AT_2Hz;
|
|
// break;
|
|
case STHS34PF80_AVG_TMOS_512:
|
|
max_odr = STHS34PF80_ODR_2_HZ;
|
|
break;
|
|
// case STHS34PF80_AVG_TMOS_1024:
|
|
// max_odr = STHS34PF80_TMOS_ODR_AT_1Hz;
|
|
// break;
|
|
case STHS34PF80_AVG_TMOS_1024:
|
|
max_odr = STHS34PF80_ODR_1_HZ;
|
|
break;
|
|
// case STHS34PF80_AVG_TMOS_2048:
|
|
// max_odr = STHS34PF80_TMOS_ODR_AT_0Hz50;
|
|
// break;
|
|
case STHS34PF80_AVG_TMOS_2048:
|
|
max_odr = STHS34PF80_ODR_0_5_HZ;
|
|
break;
|
|
}
|
|
|
|
// if (ret == 0)
|
|
// {
|
|
// if (val > max_odr)
|
|
// {
|
|
// return -1;
|
|
// }
|
|
if (odr > max_odr) {
|
|
return false; // Requested ODR exceeds maximum for current averaging setting
|
|
}
|
|
|
|
// ret = sths34pf80_tmos_odr_check_safe_set(ctx, ctrl1, (uint8_t)val);
|
|
// }
|
|
return safeSetOutputDataRate(current_odr, odr);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get output data rate configuration
|
|
* @return The current output data rate value
|
|
*/
|
|
sths34pf80_odr_t Adafruit_STHS34PF80::getOutputDataRate() {
|
|
Adafruit_BusIO_Register ctrl1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits odr_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 4, 0);
|
|
|
|
return (sths34pf80_odr_t)odr_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Reboot OTP memory
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::rebootOTPmemory() {
|
|
Adafruit_BusIO_Register ctrl2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits boot_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 7);
|
|
|
|
return boot_bit.write(1);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable or disable embedded function page access
|
|
* @param enable True to enable embedded function page, false to disable
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::enableEmbeddedFuncPage(bool enable) {
|
|
Adafruit_BusIO_Register ctrl2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits func_cfg_access_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 4);
|
|
|
|
return func_cfg_access_bit.write(enable ? 1 : 0);
|
|
}
|
|
|
|
/*!
|
|
* @brief Trigger one-shot measurement
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::triggerOneshot() {
|
|
Adafruit_BusIO_Register ctrl2_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL2, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits oneshot_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 0);
|
|
|
|
return oneshot_bit.write(1);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set interrupt polarity
|
|
* @param active_low True for active low (default), false for active high
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setIntPolarity(bool active_low) {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits int_h_l_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 1, 7);
|
|
|
|
return int_h_l_bit.write(active_low ? 1 : 0);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set interrupt output type
|
|
* @param open_drain True for open drain, false for push-pull (default)
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setIntOpenDrain(bool open_drain) {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits pp_od_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 1, 6);
|
|
|
|
return pp_od_bit.write(open_drain ? 1 : 0);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set interrupt latched mode
|
|
* @param latched True for latched mode, false for pulsed mode (default)
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setIntLatched(bool latched) {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits int_latched_bit =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 1, 2);
|
|
|
|
return int_latched_bit.write(latched ? 1 : 0);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set interrupt mask for function status flags
|
|
* @param mask Interrupt mask (bits 2:0 for PRES_FLAG, MOT_FLAG,
|
|
* TAMB_SHOCK_FLAG)
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setIntMask(uint8_t mask) {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits int_mask_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 3, 3);
|
|
|
|
return int_mask_bits.write(mask & 0x07);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get interrupt mask for function status flags
|
|
* @return Current interrupt mask value (bits 2:0 for PRES_FLAG, MOT_FLAG,
|
|
* TAMB_SHOCK_FLAG)
|
|
*/
|
|
uint8_t Adafruit_STHS34PF80::getIntMask() {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits int_mask_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 3, 3);
|
|
|
|
return int_mask_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Set interrupt signal type
|
|
* @param signal Interrupt signal type (HIGH_Z, DRDY, or INT_OR)
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::setIntSignal(sths34pf80_int_signal_t signal) {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits ien_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 2, 0);
|
|
|
|
return ien_bits.write(signal);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get interrupt signal type
|
|
* @return Current interrupt signal type
|
|
*/
|
|
sths34pf80_int_signal_t Adafruit_STHS34PF80::getIntSignal() {
|
|
Adafruit_BusIO_Register ctrl3_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits ien_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 2, 0);
|
|
|
|
return (sths34pf80_int_signal_t)ien_bits.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Check if new data is ready
|
|
* @return True if new data is available, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::isDataReady() {
|
|
Adafruit_BusIO_Register status_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_STATUS, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits drdy_bit =
|
|
Adafruit_BusIO_RegisterBits(&status_reg, 1, 2);
|
|
|
|
return drdy_bit.read() == 1;
|
|
}
|
|
|
|
/*!
|
|
* @brief Check if presence detection flag is set
|
|
* @return True if presence is detected, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::isPresence() {
|
|
Adafruit_BusIO_Register func_status_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits pres_flag_bit =
|
|
Adafruit_BusIO_RegisterBits(&func_status_reg, 1, 2);
|
|
|
|
return pres_flag_bit.read() == 1;
|
|
}
|
|
|
|
/*!
|
|
* @brief Check if motion detection flag is set
|
|
* @return True if motion is detected, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::isMotion() {
|
|
Adafruit_BusIO_Register func_status_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits mot_flag_bit =
|
|
Adafruit_BusIO_RegisterBits(&func_status_reg, 1, 1);
|
|
|
|
return mot_flag_bit.read() == 1;
|
|
}
|
|
|
|
/*!
|
|
* @brief Check if ambient temperature shock flag is set
|
|
* @return True if temperature shock is detected, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::isTempShock() {
|
|
Adafruit_BusIO_Register func_status_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits tamb_shock_flag_bit =
|
|
Adafruit_BusIO_RegisterBits(&func_status_reg, 1, 0);
|
|
|
|
return tamb_shock_flag_bit.read() == 1;
|
|
}
|
|
|
|
/*!
|
|
* @brief Read object temperature raw value
|
|
* @return 16-bit signed object temperature value
|
|
*/
|
|
int16_t Adafruit_STHS34PF80::readObjectTemperature() {
|
|
Adafruit_BusIO_Register tobj_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TOBJECT_L, 2, LSBFIRST);
|
|
|
|
return (int16_t)tobj_reg.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Read ambient temperature in degrees Celsius
|
|
* @return Ambient temperature in degrees Celsius
|
|
*/
|
|
float Adafruit_STHS34PF80::readAmbientTemperature() {
|
|
Adafruit_BusIO_Register tamb_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TAMBIENT_L, 2, LSBFIRST);
|
|
|
|
int16_t raw_temp = (int16_t)tamb_reg.read();
|
|
return raw_temp / 100.0f;
|
|
}
|
|
|
|
/*!
|
|
* @brief Read compensated object temperature raw value
|
|
* @return 16-bit signed compensated object temperature value
|
|
*/
|
|
int16_t Adafruit_STHS34PF80::readCompensatedObjectTemperature() {
|
|
Adafruit_BusIO_Register tobj_comp_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TOBJ_COMP_L, 2, LSBFIRST);
|
|
|
|
return (int16_t)tobj_comp_reg.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Read presence detection raw value
|
|
* @return 16-bit signed presence detection value
|
|
*/
|
|
int16_t Adafruit_STHS34PF80::readPresence() {
|
|
Adafruit_BusIO_Register tpres_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TPRESENCE_L, 2, LSBFIRST);
|
|
|
|
return (int16_t)tpres_reg.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Read motion detection raw value
|
|
* @return 16-bit signed motion detection value
|
|
*/
|
|
int16_t Adafruit_STHS34PF80::readMotion() {
|
|
Adafruit_BusIO_Register tmot_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TMOTION_L, 2, LSBFIRST);
|
|
|
|
return (int16_t)tmot_reg.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Read ambient temperature shock detection raw value
|
|
* @return 16-bit signed ambient temperature shock detection value
|
|
*/
|
|
int16_t Adafruit_STHS34PF80::readTempShock() {
|
|
Adafruit_BusIO_Register tamb_shock_reg = Adafruit_BusIO_Register(
|
|
i2c_dev, STHS34PF80_REG_TAMB_SHOCK_L, 2, LSBFIRST);
|
|
|
|
return (int16_t)tamb_shock_reg.read();
|
|
}
|
|
|
|
/*!
|
|
* @brief Write data to embedded function registers
|
|
* Ported from: sths34pf80_func_cfg_write
|
|
* @param addr Embedded function register address
|
|
* @param data Pointer to data to write
|
|
* @param len Number of bytes to write
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::writeEmbeddedFunction(uint8_t addr, uint8_t* data,
|
|
uint8_t len) {
|
|
// sths34pf80_ctrl1_t ctrl1;
|
|
// uint8_t odr;
|
|
// sths34pf80_page_rw_t page_rw = {0};
|
|
// int32_t ret;
|
|
// uint8_t i;
|
|
if (!i2c_dev) {
|
|
return false;
|
|
}
|
|
|
|
// /* Save current odr and enter PD mode */
|
|
// ret = sths34pf80_read_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
|
|
// odr = ctrl1.odr;
|
|
// ret += sths34pf80_tmos_odr_check_safe_set(ctx, ctrl1, 0);
|
|
sths34pf80_odr_t current_odr = getOutputDataRate();
|
|
if (!safeSetOutputDataRate(current_odr, STHS34PF80_ODR_POWER_DOWN)) {
|
|
return false;
|
|
}
|
|
|
|
// /* Enable access to embedded functions register */
|
|
// ret += sths34pf80_mem_bank_set(ctx, STHS34PF80_EMBED_FUNC_MEM_BANK);
|
|
if (!enableEmbeddedFuncPage(true)) {
|
|
return false;
|
|
}
|
|
|
|
// /* Enable write mode */
|
|
// page_rw.func_cfg_write = 1;
|
|
// ret += sths34pf80_write_reg(ctx, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw,
|
|
// 1);
|
|
Adafruit_BusIO_Register page_rw_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_PAGE_RW, 1);
|
|
Adafruit_BusIO_RegisterBits func_cfg_write_bit =
|
|
Adafruit_BusIO_RegisterBits(&page_rw_reg, 1, 6);
|
|
if (!func_cfg_write_bit.write(1)) {
|
|
enableEmbeddedFuncPage(false);
|
|
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
|
return false;
|
|
}
|
|
|
|
// /* Select register address (it will autoincrement after each write) */
|
|
// ret += sths34pf80_write_reg(ctx, STHS34PF80_FUNC_CFG_ADDR, &addr, 1);
|
|
Adafruit_BusIO_Register func_cfg_addr_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_CFG_ADDR, 1);
|
|
if (!func_cfg_addr_reg.write(addr)) {
|
|
func_cfg_write_bit.write(0);
|
|
enableEmbeddedFuncPage(false);
|
|
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
|
return false;
|
|
}
|
|
|
|
// /* Write data */
|
|
// for (i = 0; i < len; i++) {
|
|
// ret += sths34pf80_write_reg(ctx, STHS34PF80_FUNC_CFG_DATA, &data[i], 1);
|
|
// }
|
|
Adafruit_BusIO_Register func_cfg_data_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_CFG_DATA, 1);
|
|
for (uint8_t i = 0; i < len; i++) {
|
|
if (!func_cfg_data_reg.write(data[i])) {
|
|
func_cfg_write_bit.write(0);
|
|
enableEmbeddedFuncPage(false);
|
|
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// /* Disable write mode */
|
|
// page_rw.func_cfg_write = 0;
|
|
// ret += sths34pf80_write_reg(ctx, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw,
|
|
// 1);
|
|
if (!func_cfg_write_bit.write(0)) {
|
|
enableEmbeddedFuncPage(false);
|
|
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
|
return false;
|
|
}
|
|
|
|
// /* Disable access to embedded functions register */
|
|
// ret += sths34pf80_mem_bank_set(ctx, STHS34PF80_MAIN_MEM_BANK);
|
|
if (!enableEmbeddedFuncPage(false)) {
|
|
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
|
return false;
|
|
}
|
|
|
|
// /* Restore odr */
|
|
// ret += sths34pf80_tmos_odr_check_safe_set(ctx, ctrl1, odr);
|
|
if (!safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr)) {
|
|
return false;
|
|
}
|
|
|
|
// return ret;
|
|
return true;
|
|
}
|
|
|
|
/*!
|
|
* @brief Algorithm reset procedure
|
|
* Ported from: sths34pf80_algo_reset
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::algorithmReset() {
|
|
// tmp = 1;
|
|
// ret = sths34pf80_func_cfg_write(ctx, STHS34PF80_RESET_ALGO, &tmp, 1);
|
|
uint8_t reset_value = 1;
|
|
return writeEmbeddedFunction(STHS34PF80_EMBEDDED_RESET_ALGO, &reset_value, 1);
|
|
}
|
|
|
|
/*!
|
|
* @brief Safe ODR setting with proper algorithm reset and power-down procedures
|
|
* Ported from: sths34pf80_tmos_odr_check_safe_set
|
|
* @param current_odr The current output data rate
|
|
* @param new_odr The new output data rate to set
|
|
* @return True if successful, false otherwise
|
|
*/
|
|
bool Adafruit_STHS34PF80::safeSetOutputDataRate(sths34pf80_odr_t current_odr,
|
|
sths34pf80_odr_t new_odr) {
|
|
// sths34pf80_func_status_t func_status;
|
|
// sths34pf80_tmos_drdy_status_t status;
|
|
// int32_t ret = 0;
|
|
if (!i2c_dev) {
|
|
return false;
|
|
}
|
|
|
|
Adafruit_BusIO_Register ctrl1_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits odr_bits =
|
|
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 4, 0);
|
|
|
|
// if (odr_new > 0U) {
|
|
if (new_odr > STHS34PF80_ODR_POWER_DOWN) {
|
|
/*
|
|
* Do a clean reset algo procedure everytime odr is changed to an
|
|
* operative state.
|
|
*/
|
|
// ctrl1.odr = 0;
|
|
// ret = sths34pf80_write_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
|
|
if (!odr_bits.write(STHS34PF80_ODR_POWER_DOWN)) {
|
|
return false;
|
|
}
|
|
|
|
// ret += sths34pf80_algo_reset(ctx);
|
|
if (!algorithmReset()) {
|
|
return false;
|
|
}
|
|
|
|
} else {
|
|
/* if we need to go to power-down from an operative state
|
|
* perform the safe power-down.
|
|
*/
|
|
// if ((uint8_t)ctrl1.odr > 0U) {
|
|
if (current_odr > STHS34PF80_ODR_POWER_DOWN) {
|
|
/* reset the DRDY bit */
|
|
// ret = sths34pf80_read_reg(ctx, STHS34PF80_FUNC_STATUS, (uint8_t
|
|
// *)&func_status, 1);
|
|
Adafruit_BusIO_Register func_status_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
|
func_status_reg.read(); // Reading clears the DRDY bit
|
|
|
|
/* wait DRDY bit go to '1' */
|
|
// do {
|
|
// ret += sths34pf80_tmos_drdy_status_get(ctx, &status);
|
|
// } while (status.drdy != 0U);
|
|
Adafruit_BusIO_Register status_reg =
|
|
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_STATUS, 1);
|
|
|
|
Adafruit_BusIO_RegisterBits drdy_bit =
|
|
Adafruit_BusIO_RegisterBits(&status_reg, 1, 2);
|
|
|
|
uint32_t timeout = 1000; // 1 second timeout
|
|
while (timeout-- > 0) {
|
|
if (drdy_bit.read() == 1) {
|
|
break;
|
|
}
|
|
delay(1);
|
|
}
|
|
|
|
// Continue even if DRDY timeout occurs
|
|
// if (timeout == 0) {
|
|
// return false; // Timeout waiting for DRDY
|
|
// }
|
|
|
|
/* set ODR to 0 */
|
|
// ctrl1.odr = 0;
|
|
// ret += sths34pf80_write_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1,
|
|
// 1);
|
|
if (!odr_bits.write(STHS34PF80_ODR_POWER_DOWN)) {
|
|
return false;
|
|
}
|
|
|
|
/* reset the DRDY bit */
|
|
// ret += sths34pf80_read_reg(ctx, STHS34PF80_FUNC_STATUS, (uint8_t
|
|
// *)&func_status, 1);
|
|
func_status_reg.read(); // Reading clears the DRDY bit again
|
|
}
|
|
}
|
|
|
|
// Final ODR set (implied from original function usage context)
|
|
return odr_bits.write(new_odr);
|
|
} |