// Adafruit_NeoMatrix example for single NeoPixel Shield.
// Scrolls 'Howdy' across the matrix in a portrait (vertical) orientation.

// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.
//   See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_GRBW    Pixels are wired for GRBW bitstream (RGB+W NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

// Example for NeoPixel Shield.  In this application we'd like to use it
// as a 5x8 tall matrix, with the USB port positioned at the top of the
// Arduino.  When held that way, the first pixel is at the top right, and
// lines are arranged in columns, progressive order.  The shield uses
// 800 KHz (v2) pixels that expect GRB color data.

#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 8

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
                            NEO_MATRIX_RIGHT     + NEO_MATRIX_RIGHT +
                            NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(255, 255, 255), // White
  matrix.Color(255, 0, 0), // Red
  matrix.Color(0, 0, 255) // Blue
};
enum {WHITE, RED, BLUE};
int x1 = matrix.width();
int score1 = 0;
int score2 = 0;
boolean scoreUpdate = true;
#define score1_bt 7
#define score2_bt 6
//--------------------------------------------------------
void setup() {
  pinMode(score1_bt, INPUT_PULLUP);
  pinMode(score2_bt, INPUT_PULLUP);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[RED]);
  while (1) {
    matrix.fillScreen(0);
    matrix.setCursor(x1, 0);
    matrix.print(F("Ready"));
    if (--x1 < -30) {
      break;
    }
    matrix.show();
    delay(100);
  }
}
//--------------------------------------------------------
void loop() {
  if (scoreUpdate == true) {
    scoreUpdate = false;
    matrix.fillScreen(0);
    matrix.setTextColor(colors[RED]);
    matrix.setCursor(0, 0);
    matrix.print(score1);
    matrix.setTextColor(colors[WHITE]);
    matrix.setCursor(13, 0);
    matrix.print(F("X"));
    matrix.setTextColor(colors[BLUE]);
    if (score2 < 10) {
      matrix.setCursor(26, 0);
    }
    else {
      matrix.setCursor(20, 0);
    }
    matrix.print(score2);
    matrix.show();
  }
  if (digitalRead(score1_bt) == LOW) {
    delay(30);
    if (digitalRead(score1_bt) == LOW) {
      score1++;
      scoreUpdate = true;
      while (digitalRead(score1_bt) == LOW) {}
    }
  }
  if (digitalRead(score2_bt) == LOW) {
    delay(30);
    if (digitalRead(score2_bt) == LOW) {
      score2++;
      scoreUpdate = true;
      while (digitalRead(score2_bt) == LOW) {}
    }
  }
}