diff options
Diffstat (limited to 'test_fw/src/veml.cpp')
| -rw-r--r-- | test_fw/src/veml.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
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<uint8_t>(integration) << 6; + result |= static_cast<uint8_t>(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<float>(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<uint8_t>(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<uint8_t>(reg)); + wire.endTransmission(false); + wire.requestFrom(ADDR, 2); + wire.endTransmission(true); + + auto result = static_cast<uint16_t>(wire.read()); + result |= wire.read() << 8; + + return result; +} |
