aboutsummaryrefslogtreecommitdiff
path: root/test_fw/src/veml.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test_fw/src/veml.cpp')
-rw-r--r--test_fw/src/veml.cpp70
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;
+}