From 9c07c2b85d908f699f8ba590b1d60232157eca90 Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Wed, 23 Oct 2024 22:57:18 -0400 Subject: test_fw: read veml and bme --- test_fw/src/veml.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 test_fw/src/veml.cpp (limited to 'test_fw/src/veml.cpp') diff --git a/test_fw/src/veml.cpp b/test_fw/src/veml.cpp new file mode 100644 index 0000000..020a380 --- /dev/null +++ b/test_fw/src/veml.cpp @@ -0,0 +1,70 @@ +#include "veml.h" + +constexpr float BASE_LUX_PER_LSB = 0.0042f; + +using namespace ocularium::veml; + + +uint16_t Config::to_reg() const +{ + uint16_t result = 0; + + result |= shutdown ? 1 : 0; + result |= interrupt ? 1 : 0; + result |= static_cast(integration) << 6; + result |= static_cast(gain) << 11; + + return result; +} + +bool VEML::init(const Config& config) { + if (chipid() != CHIPID) return false; + + set_config(config); + write_reg(Reg::POWER, 0); + + return true; +} + +uint16_t VEML::chipid() const +{ + return read_reg(Reg::CHIPID); +} + +float VEML::lux() const +{ + const auto val = read_reg(Reg::LUX) * config.gain_factor(); + + return static_cast(val) * BASE_LUX_PER_LSB; +} + +void VEML::set_config(const Config& config) +{ + this->config = config; + write_reg(Reg::CONFIG, config.to_reg()); +} + +void VEML::write_reg(const Reg reg, const uint16_t val) const +{ + wire.beginTransmission(ADDR); + wire.write(static_cast(reg)); + wire.write(val & 0xff); + wire.write(val >> 8); + wire.endTransmission(); +} + +uint16_t VEML::read_reg(const Reg reg) const +{ + wire.flush(); + + wire.beginTransmission(ADDR); + wire.write(static_cast(reg)); + wire.endTransmission(false); + wire.requestFrom(ADDR, 2); + wire.endTransmission(true); + + auto result = static_cast(wire.read()); + result |= wire.read() << 8; + + return result; +} -- cgit v1.3.1