Files
xserve-io/center-column/addressing_patterns-tcaa/addressing_patterns-tcaa.ino

145 lines
3.5 KiB
C++

#include "Wire.h" // enable I2C bus
#define TCAADDR 0x70
byte saa1064 = 0x3B; // define the I2C bus address for our SAA1064
byte bank1;
byte bank2;
byte bank3;
byte bank4;
int TOTAL_LEDS = 23;
byte activityLED = 0b00000001;
byte leds[23][4] = {
{0b00000010, 0b00000000, 0b00000000, 0b00000000}, // 1
{0b00000000, 0b00000010, 0b00000000, 0b00000000}, // 2
{0b00000100, 0b00000000, 0b00000000, 0b00000000}, // 3
{0b00000000, 0b00000100, 0b00000000, 0b00000000}, // 4
{0b00001000, 0b00000000, 0b00000000, 0b00000000}, // 5
{0b00000000, 0b00001000, 0b00000000, 0b00000000}, // 6
{0b00010000, 0b00000000, 0b00000000, 0b00000000}, // 7
{0b00000000, 0b00010000, 0b00000000, 0b00000000}, // 8
{0b00100000, 0b00000000, 0b00000000, 0b00000000}, // 9
{0b00000000, 0b00100000, 0b00000000, 0b00000000}, // 10
{0b01000000, 0b00000000, 0b00000000, 0b00000000}, // 11
{0b00000000, 0b01000000, 0b00000000, 0b00000000}, // 12
{0b00000000, 0b00000000, 0b00000001, 0b00000000}, // 13
{0b00000000, 0b00000000, 0b00000000, 0b00000001}, // 14
{0b00000000, 0b00000000, 0b00000010, 0b00000000}, // 15
{0b00000000, 0b00000000, 0b00000000, 0b00000010}, // 16
{0b00000000, 0b00000000, 0b00000100, 0b00000000}, // 17
{0b00000000, 0b00000000, 0b00000000, 0b00000100}, // 18
{0b00000000, 0b00000000, 0b00001000, 0b00000000}, // 19
{0b00000000, 0b00000000, 0b00000000, 0b00001000}, // 20
{0b00000000, 0b00000000, 0b00010000, 0b00000000}, // 21
{0b00000000, 0b00000000, 0b00100000, 0b00000000}, // 22
{0b00000000, 0b00000000, 0b01000000, 0b00000000} // 23
};
void initDisplay()
{
Serial.println("starting display");
Wire.beginTransmission(saa1064);
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.endTransmission();
}
void setup()
{
Serial.begin(9600);
Wire.begin(); // start up I2C bus
Serial.println("setting up ports");
resetBanks();
_write();
}
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
void selectLeft() { tcaselect(2); }
void selectRight() { tcaselect(1); }
void _write() {
selectLeft();
write();
delay(1);
selectRight();
write();
}
void write() {
Wire.beginTransmission(saa1064);
Wire.write(1);
Wire.write(bank1);
Wire.write(bank2);
Wire.write(bank3);
Wire.write(bank4);
Wire.endTransmission();
}
void resetBanks() {
bank1 = 0;
bank2 = 0;
bank3 = 0;
bank4 = 0;
}
void displayNumber(int number) {
bank1 = leds[number - 1][0];
bank2 = leds[number - 1][1];
bank3 = leds[number - 1][2];
bank4 = leds[number - 1][3];
}
void displayUpToNumber(int number) {
for (int i = 0; i < number; i++) {
bank1 |= leds[i][0];
bank2 |= leds[i][1];
bank3 |= leds[i][2];
bank4 |= leds[i][3];
}
}
void displayNumbers(int* numbersList, size_t length) {
for (int i = 0; i < length; i++) {
int num = numbersList[i] - 1;
bank1 |= leds[num][0];
bank2 |= leds[num][1];
bank3 |= leds[num][2];
bank4 |= leds[num][3];
}
}
void displayPercentage(double percentDecimal) {
int numberOfTotal = round(percentDecimal * TOTAL_LEDS);
displayUpToNumber(numberOfTotal);
}
void computeEthernetActivity(bool val) {
bank1 |= val; // 0 or 1
}
void loop() {
resetBanks();
delay(10);
int length = 8;
int numbers[8] = {2,3,5,6,7,13,17,22};
displayNumbers(numbers, length);
// displayUpToNumber(15);
// displayNumber(16);
// displayPercentage(0.91);
computeEthernetActivity(false);
_write();
delay(1000);
}