#include <LedControl.h> // https://github.com/wayoda/LedControl
#include <qrcode.h> // https://github.com/ricmoo/QRCode

int size = 6;
int side = size * 8;
QRCode qrcode;

// DIN, CLK, CS
LedControl ledControls[] = {
  LedControl(0, 1, 2, size),
  LedControl(3, 4, 5, size),
  LedControl(6, 7, 8, size),
  LedControl(9, 10, 11, size),
  LedControl(A0, A1, A2, size),
  LedControl(A3, A4, A5, size),
};

int main() {
  int version = 1;
  uint8_t qrcodeData[qrcode_getBufferSize(version)];
  qrcode_initText(&qrcode, qrcodeData, version, ECC_LOW, "HUBELBAUER.NET");

  int scale = 2;
  int shift = (side - (qrcode.size * scale)) / 2;
  for (int y = shift; y < side; y++) {
    for (int x = shift; x < side; x++) {
      int index = y / 8;
      int address = size - 1 - (x / 8);
      int row = y % 8;
      int column = 7 - (x % 8);

      // Turn out of bounds dots off to make sure they don't stay on
      bool state = false;
      if (x >= shift && x < shift + (qrcode.size * scale) && y >= shift && y < shift + (qrcode.size * scale)) {
        state = qrcode_getModule(&qrcode, (x - shift) / scale, (y - shift) / scale);
      }

      ledControls[index].setLed(address, row, column, state);
    }
  }
}
u:A5.2
u:A4.2
u:AREF
u:GND.1
u:13
u:12
u:11
u:10
u:9
u:8
u:7
u:6
u:5
u:4
u:3
u:2
u:1
u:0
u:IOREF
u:RESET
u:3.3V
u:5V
u:GND.2
u:GND.3
u:VIN
u:A0
u:A1
u:A2
u:A3
u:A4
u:A5
1:V+
1:GND
1:DIN
1:CS
1:CLK
1:V+.2
1:GND.2
1:DOUT
1:CS.2
1:CLK.2
2:V+
2:GND
2:DIN
2:CS
2:CLK
2:V+.2
2:GND.2
2:DOUT
2:CS.2
2:CLK.2
3:V+
3:GND
3:DIN
3:CS
3:CLK
3:V+.2
3:GND.2
3:DOUT
3:CS.2
3:CLK.2
4:V+
4:GND
4:DIN
4:CS
4:CLK
4:V+.2
4:GND.2
4:DOUT
4:CS.2
4:CLK.2
5:V+
5:GND
5:DIN
5:CS
5:CLK
5:V+.2
5:GND.2
5:DOUT
5:CS.2
5:CLK.2
6:V+
6:GND
6:DIN
6:CS
6:CLK
6:V+.2
6:GND.2
6:DOUT
6:CS.2
6:CLK.2