pimoroni-pico/drivers/is31fl3731/is31fl3731.cpp

94 lines
2.2 KiB
C++

#include <cstdlib>
#include <math.h>
#include <map>
#include <vector>
#include "is31fl3731.hpp"
#include "common/pimoroni_common.hpp"
namespace pimoroni {
constexpr uint8_t CONFIG_BANK = 0x0b;
constexpr uint8_t NUM_PIXELS = 144;
constexpr uint8_t NUM_FRAMES = 8;
constexpr uint8_t ENABLE_OFFSET = 0x00;
constexpr uint8_t COLOR_OFFSET = 0x24;
enum mode {
PICTURE = 0x00,
AUTOPLAY = 0x08,
AUDIOPLAY = 0x18
};
enum reg : uint8_t {
MODE = 0x00,
FRAME = 0x01,
AUTPLAY1 = 0x02,
AUTOPLAY2 = 0x03,
BLINK = 0x05,
AUDIOSYNC = 0x06,
BREATH1 = 0x07,
BREATH2 = 0x08,
SHUTDOWN = 0x0a,
GAIN = 0x0b,
ADC = 0x0c,
BANK = 0xfd
};
bool IS31FL3731::init() {
i2c->reg_write_uint8(address, reg::BANK, CONFIG_BANK);
i2c->reg_write_uint8(address, reg::SHUTDOWN, 0b00000000);
clear();
update(0);
i2c->reg_write_uint8(address, reg::SHUTDOWN, 0b00000001);
i2c->reg_write_uint8(address, reg::MODE, mode::PICTURE);
i2c->reg_write_uint8(address, reg::AUDIOSYNC, 0);
return true;
}
i2c_inst_t* IS31FL3731::get_i2c() const {
return i2c->get_i2c();
}
int IS31FL3731::get_address() const {
return address;
}
int IS31FL3731::get_sda() const {
return i2c->get_sda();
}
int IS31FL3731::get_scl() const {
return i2c->get_scl();
}
void IS31FL3731::clear() {
for(auto i = 0u; i < sizeof(buf); i++) {
buf[i] = 0;
}
}
void IS31FL3731::enable(std::initializer_list<uint8_t> pattern, uint8_t frame) {
i2c->reg_write_uint8(address, reg::BANK, frame);
i2c->write_bytes(address, ENABLE_OFFSET, pattern.begin(), pattern.size());
}
void IS31FL3731::set(uint8_t index, uint8_t brightness) {
buf[index + 1] = pimoroni::GAMMA_8BIT[brightness];
}
void IS31FL3731::update(uint8_t frame) {
i2c->reg_write_uint8(address, reg::BANK, frame);
buf[0] = COLOR_OFFSET;
i2c->write_blocking(address, buf, sizeof(buf), false);
i2c->reg_write_uint8(address, reg::BANK, CONFIG_BANK); // Switch back to config bank
i2c->reg_write_uint8(address, reg::FRAME, frame); // Set the desired frame as active
}
}