#include <Arduino.h>
#include <MD_MAX72xx.h>
#include "Edgy_eyes_blink_stop.h"
//#include "Angy_eyes_blink_stop.h"
//#include "OwO_eyes_blink_stop.h"
//scheda da programmare: xiao_esp32c3
// Turn on debug statements to the serial output
#define  DEBUG  1

#if  DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)

#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)

#endif
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW/*PAROLA_HW/FC16_HW*/
#define MAX_DEVICES	16

#define CLK_PIN   6  // or SCK
#define DATA_PIN  7  // or MOSI
#define CS_PIN    4  // or SS

//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Specific SPI hardware interface
//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, SPI1, CS_PIN, MAX_DEVICES);
// Arbitrary pins
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

#define  DELAYTIME  60
//pin dei pulsanti
#define PULS1 19
#define PULS2 18
#define PULS3 8
#define PULS4 5
#define PULS5 3
#define PULS6 2
#define PULS7 1
#define PULS8 0
uint8_t face=1;    //controllo della faccia
short tempo;    //tempo di blink

void happyFace();
void loopBlink(byte x);
void idleFace();
void angyFace();
void playfulFace();
void sillyFace();
void kinkyFace();
void deathFace();
void loveFace();


void edgyEyes();
void normalMouth();
void edgyEyesBlink();
void happyEyes();
void normalMouth();
void angyEyes();
void angyMouth();
void angyEyesBlink();
void playfulEyes();
void normalMouth();
void owoEyes();
void owoEyesBlink();
void uwuEyes();
void deathEyes();
void loveEyes();
void normalNose();
void wMouth();

void setup()
{
  randomSeed(analogRead(0));
  mx.begin();
  PRINTS("\[Test Protogen os]");

  #if  DEBUG 
    Serial.begin(9600); 
  #endif
  #if  !DEBUG 
    OSBoot(); //se i debug è a 1 evito di avviare il booting per fare primax
  #endif
  pinMode(PULS1, INPUT_PULLUP);
  pinMode(PULS2, INPUT_PULLUP);
  pinMode(PULS3, INPUT_PULLUP);
  pinMode(PULS4, INPUT_PULLUP);
  pinMode(PULS5, INPUT_PULLUP);
  pinMode(PULS6, INPUT_PULLUP);
  pinMode(PULS7, INPUT_PULLUP);
  pinMode(PULS8, INPUT_PULLUP);
}
void loop()
{
  #if  DEBUG
    Serial.println(face);//se il debug è a 1 controllo se cambia la variabile dela faccia
  #endif
  tempo=0;
  switch(face){//a seconda di che pulsante si ha premuto entra in un caso della determinata faccia
    case 1:
      happyFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 2: 
      idleFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 3:
      angyFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 4:
      playfulFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 5:
      sillyFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 6:
      kinkyFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 7:
      deathFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
    case 8:
      loveFace();//faccio vedere la faccia desiderata
      loopBlink(face);
      break;
  }
}

void printSprite(uint8_t sprite[], byte setPosition){
  mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);              //auto update off
  mx.setBuffer(((setPosition+1)*COL_SIZE)-1, COL_SIZE, sprite); //set della sprite 
  mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);               //auto update on
}

void idleFace(){//componenti della faccia di idle
  edgyEyes();
  normalNose();
  normalMouth();
  edgyEyesBlink();
}

void happyFace(){//componenti della faccia felice
  happyEyes();
  normalNose();
  normalMouth();
}

void angyFace(){//componenti della faccia arrabbiata
  angyEyes();
  normalNose();
  angyMouth();
  angyEyesBlink();
}

void playfulFace(){
  playfulEyes();
  normalNose();
  normalMouth();
}

void sillyFace(){
  owoEyes();
  normalNose();
  wMouth();
  owoEyesBlink();
}

void kinkyFace(){
  uwuEyes();
  normalNose();
  wMouth();
}

void deathFace(){
  deathEyes();
  normalNose();
  wMouth();
}

void loveFace(){
  loveEyes();
  normalNose();
  wMouth();
}

void setOnLine(byte x, byte y, byte riga){
  for(byte i=x ; i<y ; i++) mx.setPoint(riga, i, true);
}

void setOffLine(byte x, byte y, byte riga){
  for(byte i=x ; i<y ; i++) mx.setPoint(riga, i, false);
}

void loopBlink(byte x){
  while(tempo<=7000){//'delay' per essere recettivo e allo stesso tempo aspettare prima di fare il blink
    delay(1);
    if(digitalRead(PULS1)) face=4;//a seconda di quale pulsante è stato premuto cambia il dato da dare allo switch
    if(digitalRead(PULS2)) face=3;
    if(digitalRead(PULS3)) face=2;
    if(digitalRead(PULS4)) face=1;
    if(digitalRead(PULS5)) face=5;
    if(digitalRead(PULS6)) face=6;
    if(digitalRead(PULS7)) face=7;
    if(digitalRead(PULS8)) face=8;
    if(face!=x){ //se face cambia pulisce le matrici e fa uscire istantaneamente dal while
      mx.clear();
      tempo=7000;
    }
    tempo++;
  }
}

void edgyEyesBlink(){
  PRINTS("\nedgy eyes blinking..");
  //ho dovuto mischiare lato destro e sinistro per colpa dei delay
  byte i, riga=1;
  for(i=32 ; i<48 ; i++){//spengo la 1/2 riga di entrambi gli occhi
    mx.setPoint(riga-1, i, false);
    mx.setPoint(riga, i, false);
  }
  for(i=64 ; i<80 ; i++){
    mx.setPoint(riga-1, i, false);
    mx.setPoint(riga, i, false);
  }
  delay(20);
  riga++;
  setOffLine(33, 48, riga);//spengo la 3 riga di entrambi gli occhi
  setOffLine(64, 79, riga);
  delay(20);
  riga++;
  riga++;
  for(i=35 ; i<47 ; i++) {//spengo la 4/5 riga di entrambi gli occhi
    mx.setPoint(riga-1, i, false);
    mx.setPoint(riga, i, false);
  }
  for(i=65 ; i<77 ; i++) {
    mx.setPoint(riga-1, i, false);
    mx.setPoint(riga, i, false);
  }
  delay(10);
  riga=7;
  setOffLine(39, 43, riga);//spengo la 6 riga di entrambi gli occhi
  setOffLine(69, 73, riga);
  delay(20);
  riga--;
  setOffLine(37, 45, riga);//spengo la 7 riga di entrambi gli occhi
  setOffLine(67, 75, riga);
  delay(20);
  riga--;
  setOffLine(36, 46, riga);//spengo la 8 riga di entrambi gli occhi
  setOffLine(66, 76, riga);
  delay(130);///////////////////////////////////////////////////////
  setOnLine(36, 46, riga);//accendo la 8 riga di entrambi gli occhi
  setOnLine(66, 76, riga);
  delay(20);
  riga++;
  setOnLine(37, 45, riga);//accendo la 7 riga di entrambi gli occhi
  setOnLine(67, 75, riga);
  delay(20);
  riga++;
  setOnLine(39, 43, riga);//accendo la 6 riga di entrambi gli occhi
  setOnLine(69, 73, riga);
  delay(20);
  riga=5;
  riga--;
  riga--;
  for(i=35 ; i<47 ; i++) {//accendo la 5/4 riga di entrambi gli occhi
    mx.setPoint(riga+1, i, true);
    mx.setPoint(riga, i, true);
  }
  for(i=65 ; i<77 ; i++) {
    mx.setPoint(riga+1, i, true);
    mx.setPoint(riga, i, true);
  }
  delay(20);
  riga--;
  setOnLine(33, 48, riga);//accendo la 3 riga di entrambi gli occhi
  setOnLine(64, 79, riga);
  delay(20);
  riga--;
  riga--;
  for(i=32 ; i<48 ; i++){//accendo la 2/1 di entrambi gli occhi
    mx.setPoint(riga+1, i, true);
    mx.setPoint(riga, i, true);
  }
  for(i=64 ; i<80 ; i++){
    mx.setPoint(riga+1, i, true);
    mx.setPoint(riga, i, true);
  }
}

void angyEyesBlink(){
  PRINTS("\nangy eyes blinking..");
  byte i, riga=0;
  setOffLine(32, 35, riga);//spengo la  riga di entrambi gli occhi
  setOffLine(77, 80, riga);
  delay(30);
  riga++;
  setOffLine(32, 38, riga);//spengo la 2 riga di entrambi gli occhi
  setOffLine(74, 80, riga);
  delay(30);
  riga++;
  setOffLine(33, 41, riga);//spengo la 3 riga di entrambi gli occhi
  setOffLine(71, 79, riga);
  delay(30);
  riga++;
  setOffLine(34, 44, riga);//spengo la 4 riga di entrambi gli occhi
  setOffLine(68, 78, riga);
  delay(30);
  riga++;
  setOffLine(34, 46, riga);//spengo la 5 riga di entrambi gli occhi
  setOffLine(66, 78, riga);
  delay(30);
  riga=7;
  setOffLine(37, 45, riga);//spengo la 6 riga di entrambi gli occhi
  setOffLine(67, 75, riga);
  delay(30);
  riga--;
  setOffLine(36, 46, riga);//spengo la 7 riga di entrambi gli occhi
  setOffLine(66, 76, riga);
  delay(30);
  riga--;
  setOffLine(35, 47, riga);//spengo la 8 riga di entrambi gli occhi
  setOffLine(65, 77, riga);
  delay(130);///////////////////////////////////////////////////////
  setOnLine(35, 47, riga);//accendo la 8 riga di entrambi gli occhi
  setOnLine(65, 77, riga);
  delay(30);
  riga++;
  setOnLine(36, 46, riga);//accendo la 7 riga di entrambi gli occhi
  setOnLine(66, 76, riga);
  delay(30);
  riga++;
  setOnLine(37, 45, riga);//accendo la 6 riga di entrambi gli occhi
  setOnLine(67, 75, riga);
  delay(30);
  riga=4;
  setOnLine(34, 46, riga);//accendo la 5 riga di entrambi gli occhi
  setOnLine(66, 78, riga);
  delay(30);
  riga--;
  setOnLine(34, 44, riga);//accendo la 4 riga di entrambi gli occhi
  setOnLine(68, 78, riga);
  delay(30);
  riga--;
  setOnLine(33, 41, riga);//accendo la 3 riga di entrambi gli occhi
  setOnLine(71, 79, riga);
  delay(30);
  riga--;
  setOnLine(32, 38, riga);//accendo la 2 riga di entrambi gli occhi
  setOnLine(74, 80, riga);
  delay(30);
  riga--;
  setOnLine(32, 35, riga);//accendo la 1 riga di entrambi gli occhi
  setOnLine(77, 80, riga);
}

void owoEyesBlink(){
  PRINTS("\nowo eyes blinking..");
  byte i, riga=0;
  setOffLine(38, 42, riga);
  setOffLine(70, 74, riga);
  delay(10);
  riga++;
  for(i=37 ; i<43 ; i++){
    if((i>=37 && i<=38) || (i>=41 && i<=42)) mx.setPoint(riga, i, false);
  }
  for(i=69 ; i<75 ; i++){
    if((i>=69 && i<=70) || (i>=73 && i<=74)) mx.setPoint(riga, i, false);
  }
  delay(10);
  riga++;
  for(i=36 ; i<44 ; i++){
    if((i>=36 && i<=37) || (i>=42 && i<=43)) mx.setPoint(riga, i, false);
  }
  for(i=68 ; i<76 ; i++){
    if((i>=68 && i<=69) || (i>=74 && i<=75)) mx.setPoint(riga, i, false);
  }
  delay(10);
  riga++;
  mx.setPoint(riga, 36, false);
  mx.setPoint(riga, 43, false);
  mx.setPoint(riga, 68, false);
  mx.setPoint(riga, 75, false);
  delay(10);
  riga++;
  mx.setPoint(riga, 36, false);
  mx.setPoint(riga, 43, false);
  mx.setPoint(riga, 68, false);
  mx.setPoint(riga, 75, false);
  delay(10);
  riga=7;
  setOffLine(38, 42, riga);
  setOffLine(70, 74, riga);
  delay(10);
  riga--;
  for(i=37 ; i<43 ; i++){
    if((i>=37 && i<=38) || (i>=41 && i<=42)) mx.setPoint(riga, i, false);
  }
  for(i=69 ; i<75 ; i++){
    if((i>=69 && i<=70) || (i>=73 && i<=74)) mx.setPoint(riga, i, false);
  }
  delay(10);
  riga--;
  for(i=36 ; i<44 ; i++){
    if((i>=36 && i<=37) || (i>=42 && i<=43)) mx.setPoint(riga, i, false);
  }
  for(i=68 ; i<76 ; i++){
    if((i>=68 && i<=69) || (i>=74 && i<=75)) mx.setPoint(riga, i, false);
  }
  delay(130);///////////////////////////////////////////////////////
  for(i=36 ; i<44 ; i++){
    if((i>=36 && i<=37) || (i>=42 && i<=43)) mx.setPoint(riga, i, true);
  }
  for(i=68 ; i<76 ; i++){
    if((i>=68 && i<=69) || (i>=74 && i<=75)) mx.setPoint(riga, i, true);
  }
  delay(10);
  riga++;
  for(i=37 ; i<43 ; i++){
    if((i>=37 && i<=38) || (i>=41 && i<=42)) mx.setPoint(riga, i, true);
  }
  for(i=69 ; i<75 ; i++){
    if((i>=69 && i<=70) || (i>=73 && i<=74)) mx.setPoint(riga, i, true);
  }
  delay(10);
  riga++;
  setOnLine(38, 42, riga);
  setOnLine(70, 74, riga);
  delay(10);
  riga=4;
  mx.setPoint(riga, 36, true);
  mx.setPoint(riga, 43, true);
  mx.setPoint(riga, 68, true);
  mx.setPoint(riga, 75, true);
  delay(10);
  riga--;
  mx.setPoint(riga, 36, true);
  mx.setPoint(riga, 43, true);
  mx.setPoint(riga, 68, true);
  mx.setPoint(riga, 75, true);
  delay(10);
  riga--;
  for(i=36 ; i<44 ; i++){
    if((i>=36 && i<=37) || (i>=42 && i<=43)) mx.setPoint(riga, i, true);
  }
  for(i=68 ; i<76 ; i++){
    if((i>=68 && i<=69) || (i>=74 && i<=75)) mx.setPoint(riga, i, true);
  }
  delay(10);
  riga--;
  for(i=37 ; i<43 ; i++){
    if((i>=37 && i<=38) || (i>=41 && i<=42)) mx.setPoint(riga, i, true);
  }
  for(i=69 ; i<75 ; i++){
    if((i>=69 && i<=70) || (i>=73 && i<=74)) mx.setPoint(riga, i, true);
  }
  delay(10);
  riga--;
  setOnLine(38, 42, riga);
  setOnLine(70, 74, riga);
}

void happyEyes(){
  PRINTS("\nhappy eyes blinking..");
  uint8_t happyEyesLeft1[COL_SIZE]{
    0b00001110,
    0b00001110,
    0b00001110,
    0b00001100,
    0b00001100,
    0b00011000,
    0b00011000,
    0b00110000,
  };
  uint8_t happyEyesleft2[COL_SIZE]{
    0b00011000,
    0b00111100,
    0b00111110,
    0b00011110,
    0b00001111,
    0b00001111,
    0b00001111,
    0b00001111,
  };
  uint8_t happyEyesright1[COL_SIZE]{
    0b00001111,
    0b00001111,
    0b00001111,
    0b00001111,
    0b00011110,
    0b00111110,
    0b00111100,
    0b00011000,
  };
  uint8_t happyEyesRight2[COL_SIZE]{
    0b00110000,
    0b00011000,
    0b00011000,
    0b00001100,
    0b00001100,
    0b00001110,
    0b00001110,
    0b00001110,
  };
  printSprite(happyEyesLeft1, 5);
  printSprite(happyEyesleft2, 6);
  printSprite(happyEyesright1, 9);
  printSprite(happyEyesRight2, 10);
  PRINTS("\nhappy eyes done");
}

void edgyEyes(){
  PRINTS("\nedgy eye booting..");
  
  printSprite(edgyEyesLeft1, 5);
  printSprite(edgyEyesleft2, 6);
  printSprite(edgyEyesright1, 9);
  printSprite(edgyEyesRight2, 10);
  
  PRINTS("\nedgy eye done");
}

void angyEyes(){
  PRINTS("\nangy eyes booting..");
  uint8_t angyEyesLeft1[COL_SIZE]{
    0b11111100,
    0b11111100,
    0b11111110,
    0b01111110,
    0b00111110,
    0b00011111,
    0b00000111,
    0b00000011
  };
  uint8_t angyEyesLeft2[COL_SIZE]{
    0b00000000,
    0b00100000,
    0b01110000,
    0b11110000,
    0b11111000,
    0b11111000,
    0b11111000,
    0b11111100
  };
  uint8_t angyEyesRight1[COL_SIZE]{
    0b11111100,
    0b11111000,
    0b11111000,
    0b11111000,
    0b11110000,
    0b01110000,
    0b00100000,
    0b00000000
  };
  uint8_t angyEyesRight2[COL_SIZE]{
    0b00000011,
    0b00000111,
    0b00011111,
    0b00111110,
    0b01111110,
    0b11111110,
    0b11111100,
    0b11111100
  };
  printSprite(angyEyesLeft1, 5);
  printSprite(angyEyesLeft2, 7);
  printSprite(angyEyesRight1, 9);
  printSprite(angyEyesRight2, 10);
  PRINTS("\nangy eyes done");
}

void playfulEyes(){
  PRINTS("\nplayful eyes booting..");
  uint8_t playfulEyesLeft1[COL_SIZE]{
    0b11000110,
    0b10000010,
    0b10000010,
    0b10000011,
    0b00000001,
    0b00000001,
    0b00000001,
    0b00000000
  };
  uint8_t playfulEyesLeft2[COL_SIZE]{
    0b00010000,
    0b00010000,
    0b00111000,
    0b00101000,
    0b00101000,
    0b01101100,
    0b01000100,
    0b01000100
  };
  uint8_t playfulEyesRight1[COL_SIZE]{
    0b01000100,
    0b01000100,
    0b01101100,
    0b00101000,
    0b00101000,
    0b00111000,
    0b00010000,
    0b00010000
  };
  uint8_t playfulEyesRight2[COL_SIZE]{
    0b00000001,
    0b00000001,
    0b00000001,
    0b10000011,
    0b10000010,
    0b10000010,
    0b10000010,
    0b11000110
  };
  printSprite(playfulEyesLeft1, 5);
  printSprite(playfulEyesLeft2, 6);
  printSprite(playfulEyesRight1, 9);
  printSprite(playfulEyesRight2, 10);
  PRINTS("\nplayful eyes done");
}
  
void owoEyes(){
  PRINTS("\nowo eyes booting..");
  uint8_t owoEyesLeftSide[COL_SIZE]{
    0b10000001,
    0b11000011,
    0b01100110,
    0b00111100,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
  };
  uint8_t owoEyesRightSide[COL_SIZE]{
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00111100,
    0b01100110,
    0b11000011,
    0b10000001
  };
  printSprite(owoEyesLeftSide, 5);
  printSprite(owoEyesRightSide, 6);
  printSprite(owoEyesLeftSide, 9);
  printSprite(owoEyesRightSide, 10);
  PRINTS("\nowo eyes done");
}

void uwuEyes(){
  PRINTS("\nuwu eyes booting..");
  uint8_t uwuEyesLeftSide[COL_SIZE]{
    0b10000000,
    0b11000000,
    0b01110000,
    0b00011111,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
  };
  uint8_t uwuEyesRightSide[COL_SIZE]{
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00011111,
    0b01110000,
    0b11000000,
    0b10000000
  };
  printSprite(uwuEyesLeftSide, 5);
  printSprite(uwuEyesRightSide, 6);
  printSprite(uwuEyesLeftSide, 9);
  printSprite(uwuEyesRightSide, 10);
  PRINTS("\nuwu eyes done");
}

void deathEyes(){
  PRINTS("\ndeath eyes booting..");
  uint8_t deathEyesLeftSide[COL_SIZE]{
    0b00011000,
    0b00111100,
    0b01111110,
    0b01100110,
    0b11100111,
    0b11000011,
    0b10000001,
    0b10000001
  };
  uint8_t deathEyesRightSide[COL_SIZE]{
    0b10000001,
    0b10000001,
    0b11000011,
    0b11100111,
    0b01100110,
    0b01111110,
    0b00111100,
    0b00011000
  };
  printSprite(deathEyesLeftSide, 5);
  printSprite(deathEyesRightSide, 6);
  printSprite(deathEyesLeftSide, 9);
  printSprite(deathEyesRightSide, 10);
  PRINTS("\ndeath eyes done");
}

void loveEyes(){
  PRINTS("\nlove eyes booting..");

  uint8_t loveEyesLeftSide[COL_SIZE]{
    0b11111100,
    0b01111110,
    0b00111111,
    0b00011110,
    0b00001100,
    0b00000000,
    0b00000000,
    0b00000000
  };
  uint8_t loveEyesRightSide[COL_SIZE]{
    0b00000000,
    0b00000000,
    0b00000000,
    0b00001100,
    0b00011110,
    0b00111111,
    0b01111110,
    0b11111100
  };
  printSprite(loveEyesLeftSide, 4);
  printSprite(loveEyesRightSide, 5);
  printSprite(loveEyesLeftSide, 8);
  printSprite(loveEyesRightSide, 9);
  PRINTS("\nlove eyes done");
}

void normalNose(){
  PRINTS("\nnormal nose booting..");
  //left e right rispetto alla faccia del protogen
  uint8_t leftboop[COL_SIZE]{
    0b00111110,
    0b00011111,
    0b00000011,
    0b00000011,
    0b00000011,
    0b00000011,
    0b00000011,
    0b00000001
  };
  uint8_t rightboop[COL_SIZE]{
    0b00000001,
    0b00000011,
    0b00000011,
    0b00000011,
    0b00000011,
    0b00000011,
    0b00011111,
    0b00111110
  };
  printSprite(leftboop, 7);
  printSprite(rightboop, 8);
  PRINTS("\nnormal nose done");
}

void normalMouth(){
  PRINTS("\nnormal mouth booting..");
  //left e right rispetto alla faccia del protogen
  uint8_t leftNormalMouth1[COL_SIZE]{
    0b00011000,
    0b00011100,
    0b00011100,
    0b00010110,
    0b00010111,
    0b00010010,
    0b00011110,
    0b00011100
  };
  uint8_t leftNormalMouth2[COL_SIZE]{
    0b10000000,
    0b11000000,
    0b11000000,
    0b01100000,
    0b01100000,
    0b00110000,
    0b00110000,
    0b00011000
  };
  uint8_t leftNormalMouth3[COL_SIZE]{
    0b00010000,
    0b00110000,
    0b00110000,
    0b01100000,
    0b01100000,
    0b11000000,
    0b11000000,
    0b10000000
  };
  uint8_t leftNormalMouth4[COL_SIZE]{
    0b11000000,
    0b01100000,
    0b01100000,
    0b00110000,
    0b00110000,
    0b00011000,
    0b00011000,
    0b00011000
  };
  uint8_t rightNormalMouth1[COL_SIZE]{
    0b00011000,
    0b00011000,
    0b00011000,
    0b00110000,
    0b00110000,
    0b01100000,
    0b01100000,
    0b11000000
  };
  uint8_t rightNormalMouth2[COL_SIZE]{
    0b10000000,
    0b11000000,
    0b11000000,
    0b01100000,
    0b01100000,
    0b00110000,
    0b00110000,
    0b00010000
  };
  uint8_t rightNormalMouth3[COL_SIZE]{
    0b00011000,
    0b00110000,
    0b00110000,
    0b01100000,
    0b01100000,
    0b11000000,
    0b11000000,
    0b10000000
  };
  uint8_t rightNormalMouth4[COL_SIZE]{
    0b00011100,
    0b00011110,
    0b00010010,
    0b00010111,
    0b00010110,
    0b00011100,
    0b00011100,
    0b00011000
  };
  
  printSprite(leftNormalMouth1, 1);
  printSprite(leftNormalMouth2, 2);
  printSprite(leftNormalMouth3, 3);
  printSprite(leftNormalMouth4, 4);
  printSprite(rightNormalMouth1, 11);
  printSprite(rightNormalMouth2, 12);
  printSprite(rightNormalMouth3, 13);
  printSprite(rightNormalMouth4, 14);
  PRINTS("\nnormal mouth done ");
}

void angyMouth(){
  PRINTS("\nangy  mouth booting..");
  //left e right in relation to the protogen face
  uint8_t leftangyMouth1[COL_SIZE]{
    0b01100000,
    0b01000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
  };
  uint8_t leftangyMouth2[COL_SIZE]{
    0b00001110,
    0b00001100,
    0b00011100,
    0b00011100,
    0b00011000,
    0b00111000,
    0b00110000,
    0b01110000
  };
  uint8_t leftangyMouth3[COL_SIZE]{
    0b00001110,
    0b00001111,
    0b00001111,
    0b00000111,
    0b00000111,
    0b00000111,
    0b00000111,
    0b00001110
  };
  uint8_t leftangyMouth4[COL_SIZE]{
    0b01111100,
    0b01111100,
    0b01111100,
    0b00111110,
    0b00111110,
    0b00011110,
    0b00011110,
    0b00011110
  };
  uint8_t rightangyMouth1[COL_SIZE]{
    0b00011110,
    0b00011110,
    0b00011110,
    0b00111110,
    0b00111110,
    0b01111100,
    0b01111100,
    0b01111100
  };
  uint8_t rightangyMouth2[COL_SIZE]{
    0b00001110,
    0b00000111,
    0b00000111,
    0b00000111,
    0b00000111,
    0b00001111,
    0b00001111,
    0b00001110
  };
  uint8_t rightangyMouth3[COL_SIZE]{
    0b01110000,
    0b00110000,
    0b00111000,
    0b00011000,
    0b00011100,
    0b00011100,
    0b00001100,
    0b00001110
  };
  uint8_t rightangyMouth4[COL_SIZE]{
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b01000000,
    0b01100000
  };
  printSprite(leftangyMouth1, 1);
  printSprite(leftangyMouth2, 2);
  printSprite(leftangyMouth3, 3);
  printSprite(leftangyMouth4, 4);
  printSprite(rightangyMouth1, 11);
  printSprite(rightangyMouth2, 12);
  printSprite(rightangyMouth3, 13);
  printSprite(rightangyMouth4, 14);
  PRINTS("\nangy mouth done ");
}

void wMouth(){
  PRINTS("\nw  mouth booting..");
  //left e right in relation to the protogen face
  uint8_t leftWMouth1[COL_SIZE]{
    0b00110000,
    0b00011000,
    0b00011100,
    0b00010110,
    0b00010111,
    0b00010010,
    0b00011110,
    0b00011100
  };
  uint8_t leftWMouth2[COL_SIZE]{
    0b00000110,
    0b00001100,
    0b00011000,
    0b00110000,
    0b01100000,
    0b11000000,
    0b11000000,
    0b01100000
  };
  uint8_t leftWMouth3[COL_SIZE]{
    0b01100000,
    0b11000000,
    0b11000000,
    0b01100000,
    0b00110000,
    0b00011000,
    0b00001100,
    0b00000110
  };
  uint8_t leftWMouth4[COL_SIZE]{
    0b00110000,
    0b00011000,
    0b00001100,
    0b00000110,
    0b00000110,
    0b00001100,
    0b00011000,
    0b00110000
  };
  uint8_t rightWMouth1[COL_SIZE]{
    0b00110000,
    0b00011000,
    0b00001100,
    0b00000110,
    0b00000110,
    0b00001100,
    0b00011000,
    0b00110000
  };
  uint8_t rightWMouth2[COL_SIZE]{
    0b00000110,
    0b00001100,
    0b00011000,
    0b00110000,
    0b01100000,
    0b11000000,
    0b11000000,
    0b01100000
  };
  uint8_t rightWMouth3[COL_SIZE]{
    0b01100000,
    0b11000000,
    0b11000000,
    0b01100000,
    0b00110000,
    0b00011000,
    0b00001100,
    0b00000110
  };
  uint8_t rightWMouth4[COL_SIZE]{
    0b00011100,
    0b00011110,
    0b00010010,
    0b00010111,
    0b00010110,
    0b00011100,
    0b00110000,
    0b00110000
  };
  printSprite(leftWMouth1, 1);
  printSprite(leftWMouth2, 2);
  printSprite(leftWMouth3, 3);
  printSprite(leftWMouth4, 4);
  printSprite(rightWMouth1, 11);
  printSprite(rightWMouth2, 12);
  printSprite(rightWMouth3, 13);
  printSprite(rightWMouth4, 14);
  PRINTS("\nw mouth done ");
}