#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; }