pimoroni-pico/drivers/ltp305/ltp305.hpp

123 lines
3.7 KiB
C++

#pragma once
#include "hardware/i2c.h"
#include "hardware/gpio.h"
namespace pimoroni {
class LTP305 {
//--------------------------------------------------
// Constants
//--------------------------------------------------
public:
static constexpr uint8_t WIDTH = 10;
static constexpr uint8_t HEIGHT = 7;
static const uint8_t DEFAULT_I2C_ADDRESS = 0x61;
static const uint8_t I2C_ADDRESS_ALTERNATE1 = 0x62;
static const uint8_t I2C_ADDRESS_ALTERNATE2 = 0x63;
static const uint8_t DEFAULT_SDA_PIN = 20;
static const uint8_t DEFAULT_SCL_PIN = 21;
static const uint8_t DEFAULT_BRIGHTNESS = 64;
static const uint8_t MAX_BRIGHTNESS = 127;
static const uint8_t DEFAULT_ON_LEVEL = 0x7f;
private:
static const uint8_t MODE = 0b00011000;
static const uint8_t OPTS = 0b00001110; // 1110 = 35mA, 0000 = 40mA
static const uint8_t CMD_BRIGHTNESS = 0x19;
static const uint8_t CMD_MODE = 0x00;
static const uint8_t CMD_UPDATE = 0x0C;
static const uint8_t CMD_OPTIONS = 0x0D;
static const uint8_t CMD_MATRIX_L = 0x0E;
static const uint8_t CMD_MATRIX_R = 0x01;
static const uint8_t BUFFER_LENGTH = 8;
static const uint8_t BUFFER_CMD = 1;
//--------------------------------------------------
// Variables
//--------------------------------------------------
private:
i2c_inst_t *i2c = i2c0;
// interface pins with our standard defaults where appropriate
int8_t address = DEFAULT_I2C_ADDRESS;
int8_t sda = DEFAULT_SDA_PIN;
int8_t scl = DEFAULT_SCL_PIN;
uint8_t brightness = DEFAULT_BRIGHTNESS;
//Including CMD in buffer to make transmission easier later on
uint8_t buf_matrix_left[BUFFER_CMD + BUFFER_LENGTH] = { CMD_MATRIX_L, 0, 0, 0, 0, 0, 0, 0, 0 };
uint8_t buf_matrix_right[BUFFER_CMD + BUFFER_LENGTH] = { CMD_MATRIX_R, 0, 0, 0, 0, 0, 0, 0, 0 };
/* How matrix buffers look with all leds illuminated
buf_matrix_left = {
// Row 7654321
0b01111111, // col 1, bottom = msb
0b01111111, // col 2
0b01111111, // col 3
0b01111111, // col 4
0b01111111, // col 5
0b00000000,
0b00000000,
0b01000000 # bit 7 = decimal dot
};
buf_matrix_right = {
// Col 12345
0b00011111, // row 1
0b00011111, // row 2
0b00011111, // row 3
0b00011111, // row 4
0b00011111, // row 5
0b00011111, // row 6
0b10011111, // row 7 + bit 8 = decimal dot
0b00000000
};*/
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
LTP305() {}
LTP305(uint8_t address) :
address(address) {}
LTP305(i2c_inst_t *i2c, uint8_t address, uint8_t sda, uint8_t scl) :
i2c(i2c), address(address), sda(sda), scl(scl) {}
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
bool init();
i2c_inst_t* get_i2c() const;
int get_address() const;
int get_sda() const;
int get_scl() const;
void set_brightness(uint8_t brightness, bool update = false);
void set_decimal(bool left = false, bool right = false);
void set_pixel(uint8_t x, uint8_t y, bool c);
void set_character(uint8_t x, uint16_t ch);
void set_image(const uint8_t *image, uint16_t image_width, uint16_t image_height,
uint16_t offset_x, uint16_t offset_y, bool wrap = false, bool bg = false, uint8_t on_level = DEFAULT_ON_LEVEL, uint8_t padding = 0);
void clear();
void show();
private:
void i2c_reg_write_uint8(uint8_t reg, uint8_t value);
};
}