From 07bc0059583309d61a68499889f93ac158013890 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Mon, 27 Mar 2023 14:42:45 +0100 Subject: [PATCH] LTR559: Refactor std::vector lookup to template. --- drivers/ltr559/ltr559.cpp | 40 ++++++++------------------------------- drivers/ltr559/ltr559.hpp | 33 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 49 deletions(-) diff --git a/drivers/ltr559/ltr559.cpp b/drivers/ltr559/ltr559.cpp index 43b36a05..35b4f56a 100644 --- a/drivers/ltr559/ltr559.cpp +++ b/drivers/ltr559/ltr559.cpp @@ -2,30 +2,6 @@ #include namespace pimoroni { - lookup::lookup(std::initializer_list values) : lut(values) { - } - - uint8_t lookup::index(uint16_t value) { - auto it = find(lut.begin(), lut.end(), value); - - if(it == lut.end()) - return 0; - - return it - lut.begin(); - } - - uint16_t lookup::value(uint8_t index) { - return lut[index]; - } - - pimoroni::lookup LTR559::lookup_led_current({5, 10, 20, 50, 100}); - pimoroni::lookup LTR559::lookup_led_duty_cycle({25, 50, 75, 100}); - pimoroni::lookup LTR559::lookup_led_pulse_freq({30, 40, 50, 60, 70, 80, 90, 100}); - pimoroni::lookup LTR559::lookup_proximity_meas_rate({10, 50, 70, 100, 200, 500, 1000, 2000}); - pimoroni::lookup LTR559::lookup_light_integration_time({100, 50, 200, 400, 150, 250, 300, 350}); - pimoroni::lookup LTR559::lookup_light_repeat_rate({50, 100, 200, 500, 1000, 2000}); - pimoroni::lookup LTR559::lookup_light_gain({1, 2, 4, 8, 0, 0, 48, 96}); - bool LTR559::init() { if(interrupt != PIN_UNUSED) { gpio_set_function(interrupt, GPIO_FUNC_SIO); @@ -129,7 +105,7 @@ namespace pimoroni { i2c->read_bytes(address, LTR559_ALS_DATA_CH1, (uint8_t *)&als, 4); data.als0 = als[1]; data.als1 = als[0]; - data.gain = this->lookup_light_gain.value((status >> LTR559_ALS_PS_STATUS_ALS_GAIN_SHIFT) & LTR559_ALS_PS_STATUS_ALS_GAIN_MASK); + data.gain = lookup_light_gain[(status >> LTR559_ALS_PS_STATUS_ALS_GAIN_SHIFT) & LTR559_ALS_PS_STATUS_ALS_GAIN_MASK]; data.ratio = 101.0f; @@ -163,12 +139,12 @@ namespace pimoroni { } void LTR559::proximity_led(uint8_t current, uint8_t duty_cycle, uint8_t pulse_freq, uint8_t num_pulses) { - current = lookup_led_current.index(current); + current = lookup(current); - duty_cycle = lookup_led_duty_cycle.index(duty_cycle); + duty_cycle = lookup(duty_cycle); duty_cycle <<= LTR559_PS_LED_DUTY_CYCLE_SHIFT; - pulse_freq = lookup_led_pulse_freq.index(pulse_freq); + pulse_freq = lookup(pulse_freq); pulse_freq <<= LTR559_PS_LED_PULSE_FREQ_SHIFT; uint8_t buf = current | duty_cycle | pulse_freq; @@ -180,7 +156,7 @@ namespace pimoroni { void LTR559::light_control(bool active, uint8_t gain) { uint8_t buf = 0; - gain = lookup_light_gain.index(gain); + gain = lookup(gain); buf |= gain << LTR559_ALS_CONTROL_GAIN_SHIFT; if(active) @@ -223,8 +199,8 @@ namespace pimoroni { void LTR559::light_measurement_rate(uint16_t integration_time, uint16_t rate) { data.integration_time = integration_time; - integration_time = lookup_light_integration_time.index(integration_time); - rate = lookup_light_repeat_rate.index(rate); + integration_time = lookup(integration_time); + rate = lookup(rate); uint8_t buf = 0; buf |= rate; buf |= integration_time << LTR559_ALS_MEAS_RATE_INTEGRATION_TIME_SHIFT; @@ -232,7 +208,7 @@ namespace pimoroni { } void LTR559::proximity_measurement_rate(uint16_t rate) { - uint8_t buf = lookup_proximity_meas_rate.index(rate); + uint8_t buf = lookup(rate); i2c->write_bytes(address, LTR559_PS_MEAS_RATE, &buf, 1); } diff --git a/drivers/ltr559/ltr559.hpp b/drivers/ltr559/ltr559.hpp index a7927055..633c6262 100644 --- a/drivers/ltr559/ltr559.hpp +++ b/drivers/ltr559/ltr559.hpp @@ -97,15 +97,6 @@ namespace pimoroni { float lux; } ltr559_reading; - class lookup { - private: - std::vector lut; - public: - lookup(std::initializer_list values); - uint8_t index(uint16_t value); - uint16_t value(uint8_t index); - }; - class LTR559 { //-------------------------------------------------- // Constants @@ -131,14 +122,13 @@ namespace pimoroni { const uint8_t address = DEFAULT_I2C_ADDRESS; uint interrupt = PIN_UNUSED; - static pimoroni::lookup lookup_led_current; - static pimoroni::lookup lookup_led_duty_cycle; - static pimoroni::lookup lookup_led_pulse_freq; - static pimoroni::lookup lookup_proximity_meas_rate; - static pimoroni::lookup lookup_light_integration_time; - static pimoroni::lookup lookup_light_repeat_rate; - static pimoroni::lookup lookup_light_gain; - + static constexpr uint16_t lookup_led_current[5] = {5, 10, 20, 50, 100}; + static constexpr uint16_t lookup_led_duty_cycle[4] = {25, 50, 75, 100}; + static constexpr uint16_t lookup_led_pulse_freq[8] = {30, 40, 50, 60, 70, 80, 90, 100}; + static constexpr uint16_t lookup_proximity_meas_rate[8] = {10, 50, 70, 100, 200, 500, 1000, 2000}; + static constexpr uint16_t lookup_light_integration_time[8] = {100, 50, 200, 400, 150, 250, 300, 350}; + static constexpr uint16_t lookup_light_repeat_rate[6] = {50, 100, 200, 500, 1000, 2000}; + static constexpr uint16_t lookup_light_gain[8] = {1, 2, 4, 8, 0, 0, 48, 96}; //-------------------------------------------------- // Constructors/Destructor @@ -177,6 +167,15 @@ namespace pimoroni { void proximity_measurement_rate(uint16_t rate); void proximity_offset(uint16_t offset); + template + const uint16_t lookup(uint16_t value) { + size_t length = sizeof(T) / sizeof(uint16_t); + for(auto i = 0u; i < length; i++) { + if(T[i] == value) return i; + } + return 0; + } + private: uint16_t bit12_to_uint16(uint16_t value); uint16_t uint16_to_bit12(uint16_t value);