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

Revision:
0:9a73d45a17de
Child:
3:0da61b470b86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Adafruit_IS31FL3731.cpp	Tue Mar 13 01:14:21 2018 +0000
@@ -0,0 +1,211 @@
+#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
+
+/* Constructor */
+/*Adafruit_IS31FL3731::Adafruit_IS31FL3731(uint8_t x, uint8_t y) : Adafruit_GFX(x, y) {
+    //myI2C = theI2C;
+    I2Cdev* myDevI2C = new I2Cdev(); 
+    myI2C = myDevI2C;
+}
+
+Adafruit_IS31FL3731_Wing::Adafruit_IS31FL3731_Wing() : Adafruit_IS31FL3731(15, 7) {
+    //myI2C = theI2C;
+    //myDevI2C
+    I2Cdev* myDevI2C = new I2Cdev(); 
+    myI2C = myDevI2C;
+}*/
+
+bool Adafruit_IS31FL3731::begin(uint8_t addr) {
+  //Wire.begin();
+ 
+
+  _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++) {
+   // Wire.beginTransmission(_i2caddr);
+   // Wire.write((byte) 0x24+i*24);
+    // write 24 bytes at once
+    myI2C->writeBytes(_i2caddr, 0x24+i*24, 24, nemo);
+    
+  /*  for (uint8_t j=0; j<24; j++) {
+     // Wire.write((byte) 0);
+       myI2C->writeByte(_i2caddr, (unsigned char)0x24+i*24, (unsigned char)0);
+
+    }*/
+   // Wire.endTransmission();
+  }
+}
+
+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) {
+ // check rotation, move pixel around if necessary
+ //myboss->printf("WING %i x %i y %i color\n",x,y,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
+// myboss->printf("%i x %i y %i color\n",x,y,color);
+  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);
+ /*Wire.beginTransmission(_i2caddr);
+ Wire.write((byte)ISSI_COMMANDREGISTER);
+ Wire.write(b);
+ Wire.endTransmission();*/
+}
+
+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);
+  
+
+  /*Wire.beginTransmission(_i2caddr);
+  Wire.write((byte)reg);
+  Wire.write((byte)data);
+  Wire.endTransmission();*/
+  //Serial.print("$"); Serial.print(reg, HEX);
+  //Serial.print(" = 0x"); Serial.println(data, HEX);
+}
+
+uint8_t  Adafruit_IS31FL3731::readRegister8(uint8_t bank, uint8_t reg) {
+ uint8_t x;
+ uint8_t status;
+
+ selectBank(bank);
+/*
+ Wire.beginTransmission(_i2caddr);
+ Wire.write((byte)reg);
+ Wire.endTransmission();
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.requestFrom(_i2caddr, (byte)1);
+ x = Wire.read();*/
+
+ status =  myI2C->readByte(_i2caddr, reg, &x);
+
+ //Wire.endTransmission();
+
+// Serial.print("$"); Serial.print(reg, HEX);
+//  Serial.print(": 0x"); Serial.println(x, HEX);
+
+  return x;
+}
\ No newline at end of file