WarGames WOPR (Created By Curt Rowlett)

// Using a SSD1331 Color OLED to simulate parts of the WOPR computer readout from the 1983 movie, "WarGames."

#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8

#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0  
#define WHITE           0xFFFF
#define LIME            0xFF00
#define GRAY            0x8410
#define ORANGE          0xFA60
#define AQUA            0x04FF
#define PINK            0xF8FF
#define GRAY            0x7BEF
#define LIGHTGRAY       0xC618
#define DARKCYAN        0x03EF
#define BROWN           0x8200
#define VIOLET          0x9199
#define SILVER          0xA510
#define GOLD            0xA508
#define NAVY            0x000F
#define MAROON          0x7800
#define PURPLE          0x780F
#define OLIVE           0x7BE0
#define NAVE            0x000F
#define DARKGREEN       0x03E0
#define DARKGREY        0x7BEF
#define GREENYELLOW     0xAFE5

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>

Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst);

  void setup(void) {
  Serial.begin(9600);
  Serial.print("");
  display.begin();

  Serial.println("init");
  uint16_t time = millis();
  display.fillScreen(BLACK);
  time = millis() - time;
  
  Serial.println(time, DEC);
  delay(500);

   }

void loop() {

  display.fillScreen(BLACK);
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("    WarGames");
  delay(8000);
  
  display.fillScreen(BLACK);
  display.setCursor(0,0);
  display.setTextColor(GREEN);
  display.print("  ~~~~~~~~~~~~");
  display.setCursor(0,30);
  display.setTextColor(GREEN);
  display.print("      WOPR");
  display.setCursor(0,60);
  display.setTextColor(GREEN);
  display.print("  ~~~~~~~~~~~~");
  delay(8000);

  display.fillScreen(BLACK);
  display.setCursor(0,20);
  display.setTextColor(BLUE);
  display.print("   GREETINGS");
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("   PROFESSOR");
  display.setCursor(0,40);
  display.setTextColor(BLUE);
  display.print("    FALKEN");
  delay(10000);
  
  display.fillScreen(BLACK);
  display.setCursor(0,20);
  display.setTextColor(BLUE);
  display.print("  SHALL WE PLAY");
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("  A GAME?");
  delay(10000);

  display.fillScreen(BLACK);
  display.setCursor(0,0);
  display.setTextColor(BLUE);
  display.print("TIC TAC TOE");
  display.setCursor(0,10);
  display.setTextColor(BLUE);
  display.print("CHECKERS");
  display.setCursor(0,20);
  display.setTextColor(BLUE);
  display.print("CHESS");
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("POKER");
  display.setCursor(0,50);
  display.setTextColor(BLUE);
  display.print("OR . . .");
  delay(8000);

  display.fillScreen(BLACK);
  display.setCursor(0,20);
  display.setTextColor(BLUE);
  display.print("      GLOBAL");
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("  THERMONUCLEAR");
  display.setCursor(0,40);
  display.setTextColor(BLUE);
  display.print("       WAR?");
  delay(8000);

  display.fillScreen(BLACK);
  display.setCursor(0,0);
  display.setTextColor(BLUE);
  display.print("A STRANGE GAME");
  display.setCursor(0,20);
  display.setTextColor(BLUE);
  display.print("THE ONLY");
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("WINNING MOVE");
  display.setCursor(0,40);
  display.setTextColor(BLUE);
  display.print("IS NOT TO PLAY");
  display.setCursor(0,50);
  delay(8000);

  display.fillScreen(BLACK);
  display.setCursor(0,0);
  display.setTextColor(BLUE);
  display.print("01110010010011");
  display.setCursor(0,10);
  display.setTextColor(BLUE);
  display.print("01110010010011");
  display.setCursor(0,20);
  display.setTextColor(BLUE);
  display.print("01110010010011");
  display.setCursor(0,30);
  display.setTextColor(BLUE);
  display.print("01110010010011");
  display.setCursor(0,40);
  display.setTextColor(BLUE);
  display.print("01110010010011");
  display.setCursor(0,50);
  display.setTextColor(BLUE);
  display.print("01110010010011");
  display.setCursor(0,60);
  delay(1000);

  display.fillScreen(BLACK);
  testfillcircles(05, BLUE);
  testdrawcircles(05, BLACK);
  delay(0050);

  display.fillScreen(BLACK);
  testfastlines(BLUE, BLUE);
  delay(0050);

  display.fillScreen(BLACK);
  testfastlines(BLUE, BLUE);
  delay(0050);

  display.fillScreen(BLACK);
  testfastlines(BLUE, BLUE);
  delay(0050);

  display.fillScreen(BLACK);
  testfastlines(BLUE, BLUE);
  delay(10000);

  }


void testlines(uint16_t color) {
   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(0, 0, x, display.height()-1, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(0, 0, display.width()-1, y, color);
   }
   
   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(display.width()-1, 0, x, display.height()-1, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(display.width()-1, 0, 0, y, color);
   }
   
   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(0, display.height()-1, x, 0, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(0, display.height()-1, display.width()-1, y, color);
   }

   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(display.width()-1, display.height()-1, x, 0, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(display.width()-1, display.height()-1, 0, y, color);
   }   
}

void testdrawtext(char *text, uint16_t color) {
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);

  for (uint8_t i=0; i < 168; i++) {
    if (i == '\n') continue;
    display.write(i);
    if ((i > 0) && (i % 21 == 0))
      display.println();
  }    
}

void testfastlines(uint16_t color1, uint16_t color2) {
   display.fillScreen(BLACK);
   for (int16_t y=0; y < display.height()-1; y+=5) {
     display.drawFastHLine(0, y, display.width()-1, color1);
   }
   for (int16_t x=0; x < display.width()-1; x+=5) {
     display.drawFastVLine(x, 0, display.height()-1, color2);
   }
}

void testdrawrects(uint16_t color) {
 display.fillScreen(BLACK);
 for (int16_t x=0; x < display.height()-1; x+=6) {
   display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color);
 }
}

void testfillrects(uint16_t color1, uint16_t color2) {
 display.fillScreen(BLACK);
 for (int16_t x=display.height()-1; x > 6; x-=6) {
   display.fillRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color1);
   display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color2);
 }
}

void testfillcircles(uint8_t radius, uint16_t color) {
  for (uint8_t x=radius; x < display.width()-1; x+=radius*2) {
    for (uint8_t y=radius; y < display.height()-1; y+=radius*2) {
      display.fillCircle(x, y, radius, color);
    }
  }  
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=0; x < display.width()-1+radius; x+=radius*2) {
    for (int16_t y=0; y < display.height()-1+radius; y+=radius*2) {
      display.drawCircle(x, y, radius, color);
    }
  }  
}

void testtriangles() {
  display.fillScreen(BLACK);
  int color = 0xF800;
  int t;
  int w = display.width()/2;
  int x = display.height();
  int y = 0;
  int z = display.width();
  for(t = 0 ; t <= 15; t+=1) {
    display.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}

void testroundrects() {
  display.fillScreen(BLACK);
  int color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
  int x = 0;
  int y = 0;
  int w = display.width();
  int h = display.height();
    for(i = 0 ; i <= 24; i+=1) {
    display.drawRoundRect(x, y, w, h, 5, color);
    x+=2;
    y+=3;
    w-=4;
    h-=6;
    color+=1100;
  }
  color+=100;
  }
}

void tftPrintTest() {

  }

void mediabuttons() {
 // play
  display.fillScreen(BLACK);
  display.fillRoundRect(25, 10, 78, 60, 8, WHITE);
  display.fillTriangle(42, 20, 42, 60, 90, 40, RED);
  delay(500);
  // pause
  display.fillRoundRect(25, 90, 78, 60, 8, WHITE);
  display.fillRoundRect(39, 98, 20, 45, 5, GREEN);
  display.fillRoundRect(69, 98, 20, 45, 5, GREEN);
  delay(500);
  // play color
  display.fillTriangle(42, 20, 42, 60, 90, 40, BLUE);
  delay(50);
  // pause color
  display.fillRoundRect(39, 98, 20, 45, 5, RED);
  display.fillRoundRect(69, 98, 20, 45, 5, RED);
  // play color
  display.fillTriangle(42, 20, 42, 60, 90, 40, GREEN);
}

/**************************************************************************/
/*! 
    @brief  Renders a simple test pattern on the LCD
*/
/**************************************************************************/
void lcdTestPattern(void)
{
  uint32_t i,j;
  display.goTo(0, 0);
  
  for(i=0;i<64;i++)
  {
    for(j=0;j<96;j++)
    {
      if(i>55){display.writeData(WHITE>>8);display.writeData(WHITE);}
      else if(i>47){display.writeData(BLUE>>8);display.writeData(BLUE);}
      else if(i>39){display.writeData(GREEN>>8);display.writeData(GREEN);}
      else if(i>31){display.writeData(CYAN>>8);display.writeData(CYAN);}
      else if(i>23){display.writeData(RED>>8);display.writeData(RED);}
      else if(i>15){display.writeData(MAGENTA>>8);display.writeData(MAGENTA);}
      else if(i>7){display.writeData(YELLOW>>8);display.writeData(YELLOW);}
      else if(i>0){display.writeData(RED>>8);display.writeData(YELLOW);}
      else {display.writeData(BLACK>>8);display.writeData(BLACK);}
    }
  }
}