#include <Arduino.h>
#include <U8g2lib.h>  // u8g2 library for drawing on OLED display - needs to be installed in Arduino IDE first
#include <Wire.h>     // wire library for IIC communication with the OLED display

const char s0[1024] PROGMEM = "                                                                              _;;;;_                   .;;:::::.::::::;.           ,:::.:::::::........,.          ,.,,..................-         _.....,......:::::;;..-         _.,.,.,.:***********:.-         -.,,..,.****;***;;**:.-         -.,.,.,.***;;****;**:._         -..,..,.;****;;:;***:._         -,....,.;***********:._          ,-_,.,.;***********:._  _,      ,- -.,.:***********:._  .,-     ,___.,.:******;;:::.._ -.,      ,_-_.,..:::.........._  .,      ,,-_.,.......,...._.._  .,      __--.,.._---__....,...::.,      ,.,,.,..............._...      :.,--.,........._..,..,        .,..,-,,.._......,,,,..,         .,,,,,...,......_-_...,          -.,,,..........-__...,           ,.......,.,_..,,,...,             _.....,........,                     ,,     ,,,,,                     ,,    ,,                        _,                              ,_                             _,_                             .,,                                                 ";
const char s1[1024] PROGMEM = "                                                                          .;;:::::::;;-             .;::::.:::::::::....:-         _,....:...............-         _.....,..........:::.._         -.,,..,..:::;;******:._         -.,.,.,.;********;**:._         -,.,,.,.;**;;***;;**:._         -,,,..,.;******;;***:._          ,....,.:****;;;****:._          ,,,..,.:***********:.,          ,---.,.:***********;.,   __     ,_--.,.:**********;:.,   ..     __-_.,..;;:::::......,  -.-     _,--.,............,..,  -._     _,--.,..,,,___...._...  _._     _.,_.,..,,,,.........,:;..      _,__...........,..,.._,..     :..,_ ,....,....._,,,,.,        ,.,,_-...._:......_,....           ,.,,..........___,..,           ,,,,.,........___...,            ,...,.._..,.......,                -,....,    ,,_                     _,    -;:,.                     _,-   _,,,-                     _,-   -,                        ,,-                             ,,                              ,,,                                                 ";
const char s2[1024] PROGMEM = "                                              *;;:;;_                 _;;;::::.::::::::;.          -:...:::::::.........._         -,.,,.,...............,          ,....,.....:::::;;*:.,          ,.,,.,.:***********;.,          ,,,..,.:**;;***;:**;.,          ,,.,.,.:**;;*******;.,          ,..,.,.:*****::;***;.,          ,....,.:************.,          __-_.,.:************.,          ,_- ,,.:************..    .     _,__.,..*****;;::::..,   ,,_    _,--,...::...........,   ..     _,--.........,...._,.,   ,,     -,--,...,_____.......,. ,.,     -.,,.................,....-   ::.,_ ,.,........_,.,,.,        ...,- ,.,.,.,....,,.,..,         _.,,,..,.,......,-_,...           ,.,,.,........___,...           ,,,,.,..,,._,..,,...,              ,.,..,.......                       ,,     -,.                      ,,      _,_                     ,,    ,.,_                      ,_    _,                        ,_                              ,.,                             ,,,-                                                ";
const char s3[1024] PROGMEM = "                                                                          -*;;::::::;;              ,;:::::.:::::::::...:-         _,....:..............._         -.....,...........::.._         -..,..,..:::;;******:._         -.,.,.,.;********;**:._         -,.,,.,.;**;;***;:**:._          ,,.,.,.:*******;***:.,          ,....,.:****;;:****;.,          ,,,..,.:***********;.,          ,---.,.:***********;.,   .;     ,_--.,.:**********;:.,  -.,     __-_.,..;;;::::......,  -._     ,,--.,............,..,  -.-     _,--.,...,,___...._..,  _.-     _,,_....,,,,,........,::..      _,__...........,..,.., ..     ;..,_ ,....,....._,.,,.,        ,.,,_-...._:......_,...,           ,,,,.,..,.....___,..,           ,.,,.,........___...,           -,...,.._..,........                -,.....-   ,,_                     _,    -;.,.                     _,    _,,,                      _,-   -,                        ,,                              ,,_                             ,,_                                                 ";
const char s4[1024] PROGMEM = "                                                                              _;;;;_                   .;;:::::.::::::;.           ,:::.:::::::........,.          ,.,,..................-         _.....,......:::::;;..-         _.,.,.,.:***********:.-         -.,,..,.****;***;;**:.-         -.,.,.,.***;;****;**:._         -..,..,.;****;;:;***:._         -,....,.;***********:._          ,-_,.,.;***********:._  _,      ,- -.,.:***********:._  .,-     ,___.,.:******;;:::.._ -.,      ,_-_.,..:::.........._  .,      ,,-_.,.......,...._.._  .,      __--.,.._---__....,...::.,      ,.,,.,..............._...      :.,--.,........._..,..,        .,..,-,,.._......,,,,..,         .,,,,,...,......_-_...,          -.,,,..........-__...,           ,.......,.,_..,,,...,             _.....,........,                     ,,     ,,,,,                     ,,    ,,                        _,                              ,_                             _,_                             .,,                                                 ";
const char s5[1024] PROGMEM = "                                         .;;;;:::::::;;              ,..:..:::::::::::::::.          ,.,,.................,          ,.....................          _.,,.,..::;;;;******..          ,,...,..************.,          ,...,,..**;:;***;;**.,          ,..,.,..*******;****.,          ,....,..*****;;;****.,          ,_-_.,..************.,          ,_- ,,..************.,          _,_-.,..************.,          _,--.,..:::::::::.....          _,--.,...............,          _,--.,..,_____....-..,,         _..,,,...,,,........,,,::,      _,-,,,.........,....._...,      -,,-,,..,,....._,,,..,          ,.,,.,.._:......,,,..,          -,...,.........-__...,          -....,......,..-__...,             ,.,..,_.,,...,....-                _..._    _,,_                     _,_     -,,                     ,,      .,-                     ,,     .,,,                     ,_                             -,_                              ,.-                                                                                ";
const char s6[1024] PROGMEM = "                                                                      -;::::::::::::.::;              ,,...:::::::::::::::;           _....,,.............,.-         ,.,...,...............-         ,,..,...;***********..          ,..,,,..************..          ,..,.,..**;:;***;;**.,          ,....,.:*****;*;****.,          ,__..,.:*****;;;****.,          ,_--.,.:***********;.,          ,_--.,.:***********;.,          ,_-,.,.:***********:._          ,, _.,..::::::::.....-          ,- _.,...............-          .,_,,,..___--_...,_..::         ,_-,,,.................:,       ,--,,,.........,..... _.,       ,,,.,,.,.,...._,._,.,:..       -,..,.,.,.......,,,.,..-        -,,,...........___,..,            ,......,..,..___....               ,...,..,........_                  _,,   _,                         -,,  ,_                       -;:,, _,_                       _,_   _,                        -,-   ,_                              ,,_                             _                                             ";
const char s7[1024] PROGMEM = "                                                                                                       -::::::::::;;;;;                _,,..::::::::::::::             ,....,,............:;-          ,.,...,...............-         ,,.,....:::::::::::...-         ,.,,,,.:************.,          .,.,.,.:**;:****;;**.,          ,....,.:********:**;.,         -,-,..,.;****;;;;***:._         -,- _.,.;***********:.-         _._-,.,.************:.          _,-_....************..          ,.--.,..:::;;;;*****.,          ,_ -.,...............,          ,.,,.,,.___,,,....,.._          ,_-,,.,..,,,,,...._...;:        . -_,....................      -,_.,.,.,,,....,,..... ..,      -,.,..,.,:.....,,._,....-       -,..,..........,__...,,           _..,...,.....-__..._              -,..,,.,_..,__..._                   ..,.........                   ,,,._ _,                        ,_--  ,,-                             ,_                             ._                             ,,,,                              _            ";
const char s8[1024] PROGMEM = "                                                                        -*******;                      _,,..........:.::.              _..,,......::::::::;-           ,.,...,..............:-         ,.,,.....:............-         ,,,..,..*********;;:..          ,,.,,,.:**;;********.,          ...,.,.:**;:****:;*;._         -,,...,.:****;;*;***;._         -,--,.,.;*****;;;***:._         _.- _.,.************:.-         _,-_,.,.************..          ,.- ,...;***********.,          ,,--.,........::::::.,          ,,_-.,,,,............,          ,,_..,..____--....-.._          ,- _,.,...............;-        ,-,_,,..,......,....._..-      -,.,..,._:,...._,.,,., ..-      -,..,,..........,,,.....-        _.............___...,,_           -.,..,_.,_..-__...,                ..........,....-                   ,,   ,_                       ,;,,, -,_                       _,    -,_                        ,    ,,                              ._                             _,,.                              _            ";
const char s9[1024] PROGMEM = "                                                                       ,.:::::::::::::;-               ,.,..:::::::::::::.             ,....,,.............;_          ..,..,...............,         -,,.,.,..;;;::::::::..,         -,,,,.,.;***********:.,         _..,..,.;**;;***;;**:._         _.....,.********;;**:.-         _,-,....*****;;:****..          ,_--,,..************.,          ,,_-.,.:************.,          ,_-_.,.:***********;.,          ,,-_.,..::::::;;;;;:._          ,- ,.,,,.............-         -,.,,.,.,_____,....,..          -,--,.,,....,,....,,..,         _,-_,,...............,.:_       _.,.,.,._......_..,.._ ..       ,..,,,..,:.....,.,,..__.,       _....,........._-,..._.,          _..,..,.....,___...-,,            -,..,..,,..,_,...                  -,_   -......_                   -,,   ,_                       ,:,_  _,_                      -,-    ,,                        _,    ,,                              ,_                             -,,_                                           ";
const char s10[1024] PROGMEM = "                                                                                                       -::::::::::;;;;;                _,,..::::::::::::::             ,....,,............:;-          ,.,...,...............-         ,,.,....:::::::::::...-         ,.,,,,.:************.,          .,.,.,.:**;:****;;**.,          ,....,.:********:**;.,         -,-,..,.;****;;;;***:._         -,- _.,.;***********:.-         _._-,.,.************:.          _,-_....************..          ,.--.,..:::;;;;*****.,          ,_ -.,...............,          ,.,,.,,.___,,,....,.._          ,_-,,.,..,,,,,...._...;:        . -_,....................      -,_.,.,.,,,....,,..... ..,      -,.,..,.,:.....,,._,....-       -,..,..........,__...,,           _..,...,.....-__..._              -,..,,.,_..,__..._                   ..,.........                   ,,,._ _,                        ,_--  ,,-                             ,_                             ._                             ,,,,                              _            ";
const char s11[1024] PROGMEM = "                                       .;;;;;:::::::::;:             -.,.::::::::::::::.::;          -,..,,................_         -,....,..............._         -,.,,.,..;;;********:._         -,,,,.,.;***********:._         -,,.,.,.;**;;***;:**:.-         -,.,..,.;****;*;;***:.-         -,,...,.;****;;;****:.-         -, -,.,.;***********:.-         -,- _.,.;***********:.-         -,-_,.,.;***********:.-         -,_ ,.,.:::::::::.....          -,- ,.,...............          -,_-,.,..____-,...__..;;*-      -,,,..,..............,,,,.:     -,--,.,.........,....,   -.     -_,-_,_.,,,...._,._,.,   ,,     -,,,.,,.,:......,,,..,   __     -,,,,.,........___,..,           _.......,..,..___...,              ,.,..,..,........_                 ,..._  ,,-                         ,._ .,                          ,, -,_                         .,  -,_                        ,,,_ _,                              ,_                              _._                              __                                           ";
const char s12[1024] PROGMEM = "                                       .;;;;;:::::::::;:             -.,.::::::::::::::.::;          -,..,,................_         -,....,..............._         -,.,,.,..;;;********:._         -,,,,.,.;***********:._         -,,.,.,.;**;;***;:**:.-         -,.,..,.;****;*;;***:.-         -,,...,.;****;;;****:.-         -, -,.,.;***********:.-         -,- _.,.;***********:.-         -,-_,.,.;***********:.-         -,_ ,.,.:::::::::.....          -,- ,.,...............          -,_-,.,..____-,...__..;;*-      -,,,..,..............,,,,.:     -,--,.,..............,   -.     -_,-_,_.,,,...._,._,.,   ,,     -,,,.,,.,:......,,,..,   __     -,,,,.,........___,..,           _.......,..,..___...,              ,.,..,..,........_                 ,..._  ,,-                         ,._ .,                          ,, -,_                         .,  -,_                        ,,,_ _,                              ,_                              _._                              __                                           ";
const char s13[1024] PROGMEM = "                                                                               -__-                    --__,,..::::.,__-           ,::..:::::::........,,          ,,,,..................          ,.....,.....:::::;;;..          _.,.,...;***********..          _.,,....****;***;;**:.          -.,.,.,.***;;*******:.          -..,..,.*****;;:;***:.          -.....,.************:.          -,-_,.,.;***********:.           ,- -.,.;***********:.    _      ,___.,.:******;::::..-  -_      ,_-_.,..:::..........-  _-      ,,-_.,.......,....-..-  _-      __--.,.._---__.......,__,-      _.,,.,...............-.._     -;.,--.,........._.,,..-        :,..,-.,.._......,,,...-          -,.,,,..,......_-_...-          -..,...........-__...-           ,.......,.,_..,,,...-             _.....,.......,_                     ,,     __,,                      _-    ,_-,                      --                              --                              _                              -,,                                                 ";
const char s14[1024] PROGMEM = "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------____----------------------------____----------------------------.___----------------------------:...----------------------------::::----------------------------;:::----------------------------;;;;----------------------------:;;;----------------------------::::----------------------------.:::----------------------------,...----------------------------,,,,----------------------------,,,,----------------------------_,,,----------------------------.___----------------------------.,__----------------------------,-------------------------------------------------------------------------------------------------------------------------------------------------------------------";
const char s15[1024] PROGMEM = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
const char* storage[] = {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15};

static int currentFrame = 0;


char buffer[1024];

U8G2_SH1107_128X128_1_HW_I2C oled(U8G2_R0);

void setup() {
  oled.begin();
  oled.setContrast(255);
  oled.setFont(u8g2_font_u8glib_4_tr);
  oled.setDrawColor(1);
}

void loop() {
  oled.firstPage();
  memcpy_P(buffer, (PGM_P)storage[currentFrame],1024);  //Copy frame from PROGMEM to local buffer. TODO: Make buffer smaller to preserve GLOB mem.

  if (currentFrame == (sizeof(storage)/sizeof(storage[0]))-1){
    currentFrame=0;
  }

  else{
    currentFrame++;
  }

  do {

    int buffSize = strlen(buffer);
    int xpos = 0;
    int ypos = 0;
    char c;
    for (int i = 0; i < buffSize; i++) {
      if (i % 64 == 0) {
        ypos += 8;
        xpos = 0;
      }
      c = buffer[i];
      if (c == ' ') {
        xpos += 4;
        continue;
      }

      oled.drawGlyph(xpos, ypos, c);
      xpos += 4;
    }

  } while (oled.nextPage());

  delay(0);
}