Port of the Adafruit_IS31FL3731 library for Arduino. Enables control of the feather Charliewing LED Matrix peripheral board. Makes use of the I2Cdev library for I2C.
Dependencies: I2Cdev_MAX32630FTHR
Defaulty uses pinmap for the Maxim 32630FTHR Pegasus board. For a different board, change pin definitions in I2Cdev.h
Adafruit_IS31FL3731.cpp
- Committer:
- DVLevine
- Date:
- 2018-03-17
- Revision:
- 3:0da61b470b86
- Parent:
- 0:9a73d45a17de
File content as of revision 3:0da61b470b86:
#include "Adafruit_IS31FL3731.h"
#include "Adafruit_GFX.h"
#ifndef _swap_int16_t
#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
#endif
bool Adafruit_IS31FL3731::begin(uint8_t addr) {
_i2caddr = addr;
_frame = 0;
// shutdown
writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_SHUTDOWN, 0x00);
//delay(10);
wait(0.01);
// out of shutdown
writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_SHUTDOWN, 0x01);
// picture mode
writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
displayFrame(_frame);
// all LEDs on & 0 PWM
clear(); // set each led to 0 PWM
for (uint8_t f=0; f<8; f++) {
for (uint8_t i=0; i<=0x11; i++)
writeRegister8(f, i, 0xff); // each 8 LEDs on
}
audioSync(false);
return true;
}
void Adafruit_IS31FL3731::clear(void) {
// all LEDs on & 0 PWM
selectBank(_frame);
uint8_t nemo[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for (uint8_t i=0; i<6; i++) {
// write 24 bytes at once
myI2C->writeBytes(_i2caddr, 0x24+i*24, 24, nemo);
}
}
void Adafruit_IS31FL3731::setLEDPWM(uint8_t lednum, uint8_t pwm, uint8_t bank) {
if (lednum >= 144) return;
writeRegister8(bank, 0x24+lednum, pwm);
}
void Adafruit_IS31FL3731_Wing::drawPixel(int16_t x, int16_t y, uint16_t color) {
switch (getRotation()) {
case 1:
_swap_int16_t(x, y);
x = 15 - x - 1;
break;
case 2:
x = 15 - x - 1;
y = 7 - y - 1;
break;
case 3:
_swap_int16_t(x, y);
y = 9 - y - 1;
break;
}
// charlie wing is smaller:
if ((x < 0) || (x >= 16) || (y < 0) || (y >= 7)) return;
if (x > 7) {
x=15-x;
y += 8;
} else {
y = 7-y;
}
_swap_int16_t(x, y);
if (color > 255) color = 255; // PWM 8bit max
setLEDPWM(x + y*16, color, _frame);
return;
}
void Adafruit_IS31FL3731::drawPixel(int16_t x, int16_t y, uint16_t color) {
// check rotation, move pixel around if necessary
switch (getRotation()) {
case 1:
_swap_int16_t(x, y);
x = 16 - x - 1;
break;
case 2:
x = 16 - x - 1;
y = 9 - y - 1;
break;
case 3:
_swap_int16_t(x, y);
y = 9 - y - 1;
break;
}
if ((x < 0) || (x >= 16)) return;
if ((y < 0) || (y >= 9)) return;
if (color > 255) color = 255; // PWM 8bit max
setLEDPWM(x + y*16, color, _frame);
return;
}
void Adafruit_IS31FL3731::setFrame(uint8_t f) {
_frame = f;
}
void Adafruit_IS31FL3731::displayFrame(uint8_t f) {
if (f > 7) f = 0;
writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_PICTUREFRAME, f);
}
void Adafruit_IS31FL3731::selectBank(uint8_t b) {
myI2C->writeByte(_i2caddr, ISSI_COMMANDREGISTER, b);
}
void Adafruit_IS31FL3731::audioSync(bool sync) {
if (sync) {
writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_AUDIOSYNC, 0x1);
} else {
writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_AUDIOSYNC, 0x0);
}
}
/*************/
void Adafruit_IS31FL3731::writeRegister8(uint8_t b, uint8_t reg, uint8_t data) {
selectBank(b);
myI2C->writeByte(_i2caddr, reg, data);
}
uint8_t Adafruit_IS31FL3731::readRegister8(uint8_t bank, uint8_t reg) {
uint8_t x;
//uint8_t status;
selectBank(bank);
//status =
myI2C->readByte(_i2caddr, reg, &x);
return x;
}