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

Committer:
DVLevine
Date:
Sat Mar 17 23:15:19 2018 +0000
Revision:
3:0da61b470b86
Parent:
0:9a73d45a17de
Cleaned up comments a bit. Removed old commend out code from arduino port.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DVLevine 0:9a73d45a17de 1 #include "Adafruit_IS31FL3731.h"
DVLevine 0:9a73d45a17de 2 #include "Adafruit_GFX.h"
DVLevine 0:9a73d45a17de 3 #ifndef _swap_int16_t
DVLevine 0:9a73d45a17de 4 #define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
DVLevine 0:9a73d45a17de 5 #endif
DVLevine 0:9a73d45a17de 6
DVLevine 0:9a73d45a17de 7 bool Adafruit_IS31FL3731::begin(uint8_t addr) {
DVLevine 0:9a73d45a17de 8
DVLevine 0:9a73d45a17de 9 _i2caddr = addr;
DVLevine 0:9a73d45a17de 10 _frame = 0;
DVLevine 0:9a73d45a17de 11
DVLevine 0:9a73d45a17de 12 // shutdown
DVLevine 0:9a73d45a17de 13 writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_SHUTDOWN, 0x00);
DVLevine 0:9a73d45a17de 14
DVLevine 0:9a73d45a17de 15 //delay(10);
DVLevine 0:9a73d45a17de 16 wait(0.01);
DVLevine 0:9a73d45a17de 17
DVLevine 0:9a73d45a17de 18
DVLevine 0:9a73d45a17de 19 // out of shutdown
DVLevine 0:9a73d45a17de 20 writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_SHUTDOWN, 0x01);
DVLevine 0:9a73d45a17de 21
DVLevine 0:9a73d45a17de 22 // picture mode
DVLevine 0:9a73d45a17de 23 writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
DVLevine 0:9a73d45a17de 24
DVLevine 0:9a73d45a17de 25 displayFrame(_frame);
DVLevine 0:9a73d45a17de 26
DVLevine 0:9a73d45a17de 27 // all LEDs on & 0 PWM
DVLevine 0:9a73d45a17de 28 clear(); // set each led to 0 PWM
DVLevine 0:9a73d45a17de 29
DVLevine 0:9a73d45a17de 30 for (uint8_t f=0; f<8; f++) {
DVLevine 0:9a73d45a17de 31 for (uint8_t i=0; i<=0x11; i++)
DVLevine 0:9a73d45a17de 32 writeRegister8(f, i, 0xff); // each 8 LEDs on
DVLevine 0:9a73d45a17de 33 }
DVLevine 0:9a73d45a17de 34
DVLevine 0:9a73d45a17de 35 audioSync(false);
DVLevine 0:9a73d45a17de 36
DVLevine 0:9a73d45a17de 37 return true;
DVLevine 0:9a73d45a17de 38 }
DVLevine 0:9a73d45a17de 39
DVLevine 0:9a73d45a17de 40 void Adafruit_IS31FL3731::clear(void) {
DVLevine 0:9a73d45a17de 41 // all LEDs on & 0 PWM
DVLevine 0:9a73d45a17de 42
DVLevine 0:9a73d45a17de 43 selectBank(_frame);
DVLevine 0:9a73d45a17de 44
DVLevine 0:9a73d45a17de 45 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};
DVLevine 0:9a73d45a17de 46
DVLevine 0:9a73d45a17de 47 for (uint8_t i=0; i<6; i++) {
DVLevine 0:9a73d45a17de 48 // write 24 bytes at once
DVLevine 0:9a73d45a17de 49 myI2C->writeBytes(_i2caddr, 0x24+i*24, 24, nemo);
DVLevine 0:9a73d45a17de 50 }
DVLevine 0:9a73d45a17de 51 }
DVLevine 0:9a73d45a17de 52
DVLevine 0:9a73d45a17de 53 void Adafruit_IS31FL3731::setLEDPWM(uint8_t lednum, uint8_t pwm, uint8_t bank) {
DVLevine 0:9a73d45a17de 54 if (lednum >= 144) return;
DVLevine 0:9a73d45a17de 55 writeRegister8(bank, 0x24+lednum, pwm);
DVLevine 0:9a73d45a17de 56 }
DVLevine 0:9a73d45a17de 57
DVLevine 0:9a73d45a17de 58
DVLevine 0:9a73d45a17de 59 void Adafruit_IS31FL3731_Wing::drawPixel(int16_t x, int16_t y, uint16_t color) {
DVLevine 0:9a73d45a17de 60 switch (getRotation()) {
DVLevine 0:9a73d45a17de 61 case 1:
DVLevine 0:9a73d45a17de 62 _swap_int16_t(x, y);
DVLevine 0:9a73d45a17de 63 x = 15 - x - 1;
DVLevine 0:9a73d45a17de 64 break;
DVLevine 0:9a73d45a17de 65 case 2:
DVLevine 0:9a73d45a17de 66 x = 15 - x - 1;
DVLevine 0:9a73d45a17de 67 y = 7 - y - 1;
DVLevine 0:9a73d45a17de 68 break;
DVLevine 0:9a73d45a17de 69 case 3:
DVLevine 0:9a73d45a17de 70 _swap_int16_t(x, y);
DVLevine 0:9a73d45a17de 71 y = 9 - y - 1;
DVLevine 0:9a73d45a17de 72 break;
DVLevine 0:9a73d45a17de 73 }
DVLevine 0:9a73d45a17de 74
DVLevine 0:9a73d45a17de 75 // charlie wing is smaller:
DVLevine 0:9a73d45a17de 76 if ((x < 0) || (x >= 16) || (y < 0) || (y >= 7)) return;
DVLevine 0:9a73d45a17de 77
DVLevine 0:9a73d45a17de 78 if (x > 7) {
DVLevine 0:9a73d45a17de 79 x=15-x;
DVLevine 0:9a73d45a17de 80 y += 8;
DVLevine 0:9a73d45a17de 81 } else {
DVLevine 0:9a73d45a17de 82 y = 7-y;
DVLevine 0:9a73d45a17de 83 }
DVLevine 0:9a73d45a17de 84
DVLevine 0:9a73d45a17de 85 _swap_int16_t(x, y);
DVLevine 0:9a73d45a17de 86
DVLevine 0:9a73d45a17de 87 if (color > 255) color = 255; // PWM 8bit max
DVLevine 0:9a73d45a17de 88
DVLevine 0:9a73d45a17de 89 setLEDPWM(x + y*16, color, _frame);
DVLevine 0:9a73d45a17de 90 return;
DVLevine 0:9a73d45a17de 91 }
DVLevine 0:9a73d45a17de 92
DVLevine 0:9a73d45a17de 93
DVLevine 0:9a73d45a17de 94
DVLevine 0:9a73d45a17de 95 void Adafruit_IS31FL3731::drawPixel(int16_t x, int16_t y, uint16_t color) {
DVLevine 0:9a73d45a17de 96 // check rotation, move pixel around if necessary
DVLevine 0:9a73d45a17de 97 switch (getRotation()) {
DVLevine 0:9a73d45a17de 98 case 1:
DVLevine 0:9a73d45a17de 99 _swap_int16_t(x, y);
DVLevine 0:9a73d45a17de 100 x = 16 - x - 1;
DVLevine 0:9a73d45a17de 101 break;
DVLevine 0:9a73d45a17de 102 case 2:
DVLevine 0:9a73d45a17de 103 x = 16 - x - 1;
DVLevine 0:9a73d45a17de 104 y = 9 - y - 1;
DVLevine 0:9a73d45a17de 105 break;
DVLevine 0:9a73d45a17de 106 case 3:
DVLevine 0:9a73d45a17de 107 _swap_int16_t(x, y);
DVLevine 0:9a73d45a17de 108 y = 9 - y - 1;
DVLevine 0:9a73d45a17de 109 break;
DVLevine 0:9a73d45a17de 110 }
DVLevine 0:9a73d45a17de 111
DVLevine 0:9a73d45a17de 112 if ((x < 0) || (x >= 16)) return;
DVLevine 0:9a73d45a17de 113 if ((y < 0) || (y >= 9)) return;
DVLevine 0:9a73d45a17de 114 if (color > 255) color = 255; // PWM 8bit max
DVLevine 0:9a73d45a17de 115
DVLevine 0:9a73d45a17de 116 setLEDPWM(x + y*16, color, _frame);
DVLevine 0:9a73d45a17de 117 return;
DVLevine 0:9a73d45a17de 118 }
DVLevine 0:9a73d45a17de 119
DVLevine 0:9a73d45a17de 120 void Adafruit_IS31FL3731::setFrame(uint8_t f) {
DVLevine 0:9a73d45a17de 121 _frame = f;
DVLevine 0:9a73d45a17de 122 }
DVLevine 0:9a73d45a17de 123
DVLevine 0:9a73d45a17de 124 void Adafruit_IS31FL3731::displayFrame(uint8_t f) {
DVLevine 0:9a73d45a17de 125 if (f > 7) f = 0;
DVLevine 0:9a73d45a17de 126 writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_PICTUREFRAME, f);
DVLevine 0:9a73d45a17de 127 }
DVLevine 0:9a73d45a17de 128
DVLevine 0:9a73d45a17de 129
DVLevine 0:9a73d45a17de 130 void Adafruit_IS31FL3731::selectBank(uint8_t b) {
DVLevine 0:9a73d45a17de 131 myI2C->writeByte(_i2caddr, ISSI_COMMANDREGISTER, b);
DVLevine 0:9a73d45a17de 132 }
DVLevine 0:9a73d45a17de 133
DVLevine 0:9a73d45a17de 134 void Adafruit_IS31FL3731::audioSync(bool sync) {
DVLevine 0:9a73d45a17de 135 if (sync) {
DVLevine 0:9a73d45a17de 136 writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_AUDIOSYNC, 0x1);
DVLevine 0:9a73d45a17de 137 } else {
DVLevine 0:9a73d45a17de 138 writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_AUDIOSYNC, 0x0);
DVLevine 0:9a73d45a17de 139 }
DVLevine 0:9a73d45a17de 140 }
DVLevine 0:9a73d45a17de 141
DVLevine 0:9a73d45a17de 142 /*************/
DVLevine 0:9a73d45a17de 143 void Adafruit_IS31FL3731::writeRegister8(uint8_t b, uint8_t reg, uint8_t data) {
DVLevine 0:9a73d45a17de 144 selectBank(b);
DVLevine 0:9a73d45a17de 145
DVLevine 0:9a73d45a17de 146 myI2C->writeByte(_i2caddr, reg, data);
DVLevine 0:9a73d45a17de 147 }
DVLevine 0:9a73d45a17de 148
DVLevine 0:9a73d45a17de 149 uint8_t Adafruit_IS31FL3731::readRegister8(uint8_t bank, uint8_t reg) {
DVLevine 0:9a73d45a17de 150 uint8_t x;
DVLevine 3:0da61b470b86 151 //uint8_t status;
DVLevine 0:9a73d45a17de 152
DVLevine 0:9a73d45a17de 153 selectBank(bank);
DVLevine 0:9a73d45a17de 154
DVLevine 3:0da61b470b86 155 //status =
DVLevine 3:0da61b470b86 156 myI2C->readByte(_i2caddr, reg, &x);
DVLevine 0:9a73d45a17de 157
DVLevine 0:9a73d45a17de 158 return x;
DVLevine 0:9a73d45a17de 159 }