mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
9a98d1be55
IS31FL3731: add driver for IS31FL3731 matrix LED driver
107 lines
2.9 KiB
Go
107 lines
2.9 KiB
Go
package is31fl3731
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"tinygo.org/x/drivers"
|
|
)
|
|
|
|
// DeviceAdafruitCharlieWing15x7 implements TinyGo driver for Lumissil
|
|
// IS31FL3731 matrix LED driver on Adafruit 15x7 CharliePlex LED Matrix
|
|
// FeatherWing (CharlieWing) board: https://www.adafruit.com/product/3163
|
|
type DeviceAdafruitCharlieWing15x7 struct {
|
|
Device
|
|
}
|
|
|
|
// enableLEDs enables only LEDs that are soldered on the Adafruit CharlieWing
|
|
// board. The board has following LEDs matrix layout:
|
|
//
|
|
// "o" - connected (soldered) LEDs
|
|
// "x" - not connected LEDs
|
|
//
|
|
// + - - - - - - - - - - - - - - +
|
|
// | + - - - - - - - - - - - - + |
|
|
// | | | |
|
|
// | | v v
|
|
// +---------------------------------+
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | o o o o o o o o o o o o o o o x |
|
|
// | x x x x x x x x x x x x x x x x |
|
|
// +---------------------------------+
|
|
// ^ ^ | |
|
|
// | | ... - - + |
|
|
// | + - - - - - - - - - - - - - +
|
|
// |
|
|
// start (address 0x00)
|
|
//
|
|
func (d *DeviceAdafruitCharlieWing15x7) enableLEDs() (err error) {
|
|
for frame := FRAME_0; frame <= FRAME_7; frame++ {
|
|
err = d.selectCommand(frame)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Enable left half
|
|
for i := uint8(0); i < 16; i += 2 {
|
|
err = d.bus.WriteRegister(d.Address, i, []byte{0b11111110})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
// Enable right half
|
|
for i := uint8(3); i < 16; i += 2 {
|
|
err = d.bus.WriteRegister(d.Address, i, []byte{0b01111111})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
// Disable invisible column on the right side
|
|
err = d.bus.WriteRegister(d.Address, 1, []byte{0b00000000})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// DrawPixelXY draws a single pixel on the selected frame by its XY coordinates
|
|
// with provided PWM value [0-255]
|
|
func (d *DeviceAdafruitCharlieWing15x7) DrawPixelXY(frame, x, y, value uint8) (err error) {
|
|
var index uint8
|
|
|
|
if x >= 15 {
|
|
return fmt.Errorf("invalid value: X is out of range [0, 15]")
|
|
} else if y >= 7 {
|
|
return fmt.Errorf("invalid value: Y is out of range [0, 7]")
|
|
}
|
|
|
|
// Board is one pixel shorter (7 vs 8 supported pixels)
|
|
if x < 8 {
|
|
index = 16*x + y + 1
|
|
} else {
|
|
index = 16*(16-x) - y - 1 - 1
|
|
}
|
|
|
|
return d.setPixelPWD(frame, index, value)
|
|
}
|
|
|
|
// NewAdafruitCharlieWing15x7 creates a new driver with Adafruit 15x7
|
|
// CharliePlex LED Matrix FeatherWing (CharlieWing) layout.
|
|
// Available addresses:
|
|
// - 0x74 (default)
|
|
// - 0x77 (when the address jumper soldered)
|
|
func NewAdafruitCharlieWing15x7(bus drivers.I2C, address uint8) DeviceAdafruitCharlieWing15x7 {
|
|
return DeviceAdafruitCharlieWing15x7{
|
|
Device: Device{
|
|
Address: address,
|
|
bus: bus,
|
|
},
|
|
}
|
|
}
|