diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d13839..082ad47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [Unreleased] + +### Fixed + +- Wrong computation of sensor variant in method getSensorVariant ## [1.0.0] - 2025-1-30 diff --git a/README.md b/README.md index b6f600a..7fcb8a7 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ support it are listed in the API description. | ------------- | -------------- | |[SCD40](https://sensirion.com/products/catalog/SCD40)| **0x62**| |[SCD41](https://sensirion.com/products/catalog/SCD41)| **0x62**| +|[SCD43](https://sensirion.com/products/catalog/SCD43)| **0x62**| The following instructions and examples use a *SCD41*. diff --git a/scd4x_i2c.c b/scd4x_i2c.c index 0602866..581559e 100644 --- a/scd4x_i2c.c +++ b/scd4x_i2c.c @@ -162,24 +162,27 @@ int16_t scd4x_get_data_ready_status(bool* arg_0) { } int16_t scd4x_get_sensor_variant(scd4x_sensor_variant* a_sensor_variant) { + scd4x_sensor_variant ret_val = SCD4X_SENSOR_VARIANT_MASK; uint16_t raw_sensor_variant = 0; + uint16_t my_sensor_variant = 0; int16_t local_error = 0; + ret_val = SCD4X_SENSOR_VARIANT_MASK; + uint16_t mask = (uint16_t)(ret_val); local_error = scd4x_get_sensor_variant_raw(&raw_sensor_variant); if (local_error != NO_ERROR) { return local_error; } - uint16_t variant = (uint16_t)(raw_sensor_variant & 4); - if (variant == 0) { - *a_sensor_variant = SCD4X_SENSOR_VARIANT_SCD40; - ; - return local_error; - } else if (variant == 1) { - *a_sensor_variant = SCD4X_SENSOR_VARIANT_SCD41; - ; - return local_error; + my_sensor_variant = (uint16_t)(raw_sensor_variant & mask); + if (my_sensor_variant == (uint16_t)(SCD4X_SENSOR_VARIANT_SCD40)) { + ret_val = SCD4X_SENSOR_VARIANT_SCD40; + } else if (my_sensor_variant == (uint16_t)(SCD4X_SENSOR_VARIANT_SCD41)) { + ret_val = SCD4X_SENSOR_VARIANT_SCD41; + } else if (my_sensor_variant == (uint16_t)(SCD4X_SENSOR_VARIANT_SCD42)) { + ret_val = SCD4X_SENSOR_VARIANT_SCD42; + } else if (my_sensor_variant == (uint16_t)(SCD4X_SENSOR_VARIANT_SCD43)) { + ret_val = SCD4X_SENSOR_VARIANT_SCD43; } - *a_sensor_variant = SCD4X_SENSOR_VARIANT_UNKNOWN; - ; + *a_sensor_variant = ret_val; return local_error; } diff --git a/scd4x_i2c.h b/scd4x_i2c.h index 16138f6..1b7168b 100644 --- a/scd4x_i2c.h +++ b/scd4x_i2c.h @@ -46,6 +46,7 @@ extern "C" { #include "sensirion_config.h" #define SCD40_I2C_ADDR_62 0x62 #define SCD41_I2C_ADDR_62 0x62 +#define SCD43_I2C_ADDR_62 0x62 typedef enum { SCD4X_START_PERIODIC_MEASUREMENT_CMD_ID = 0x21b1, @@ -81,9 +82,11 @@ typedef enum { } SCD4X_CMD_ID; typedef enum { - SCD4X_SENSOR_VARIANT_UNKNOWN = 0, - SCD4X_SENSOR_VARIANT_SCD40 = 1, - SCD4X_SENSOR_VARIANT_SCD41 = 2, + SCD4X_SENSOR_VARIANT_MASK = 0xF000, + SCD4X_SENSOR_VARIANT_SCD40 = 0x0000, + SCD4X_SENSOR_VARIANT_SCD41 = 0x1000, + SCD4X_SENSOR_VARIANT_SCD42 = 0x2000, + SCD4X_SENSOR_VARIANT_SCD43 = 0x5000 } scd4x_sensor_variant; /** @@ -686,7 +689,7 @@ int16_t scd4x_reinit(); * @brief Reads out the SCD4x sensor variant. * * @param[out] sensor_variant Bits[15…12] = 0000 → SCD40 Bits[15…12] = 0001 → - * SCD41 + * SCD41 Bits[15…12] = 0101 → SCD43 * * @note This command is only available in idle mode. *