//Gijs Gieskes 2010

#include <TrueRandom.h>

boolean switcher = true;
byte buttons = 0;

boolean UD = true;

void setup() {
  randomSeed(analogRead(0));
    
  pinMode(7, INPUT);
  digitalWrite(7, HIGH);
  
  pinMode(8, OUTPUT);  //reset
  
  pinMode(9, OUTPUT);  //start
  pinMode(10, OUTPUT); //B
  pinMode(11, OUTPUT); //select
  pinMode(12, OUTPUT); //A
  
  pinMode(16, OUTPUT); //right
  pinMode(17, OUTPUT); //left
  pinMode(18, OUTPUT); //up
  pinMode(19, OUTPUT); //down
  
  delay(2500);
}

void loop(){
  
  if(digitalRead(7) == LOW){
    while(digitalRead(7) == LOW){}
    switcher = !switcher;
  }
  
  if(switcher){
    
    RArrow();
    RKeys();
    ScreenSwitch();
    tryToAvoidEMPTYandADD();
    startStop();
    startAll();
    copyPaste();
    
    repeatAddDown();
    reset();
  }else{
    allLow();
  }
}


void repeatAddDown(){
  //
  if(!TrueRandom.random(20)){
    for(byte i = TrueRandom.random(1, 10); i>0; i--){
      allLow();
      digitalWrite(19, HIGH); //down
      delay(random(300));     //scroll down for random amount of time
      digitalWrite(19, LOW);
      delay(100);
      digitalWrite(12, HIGH); //add something
      delay(100);
      allLow();
    }
  }
}

void copyPaste(){
  //copy paste 
  if(!TrueRandom.random(20)){
    allLow();
    digitalWrite(11, HIGH); //select
    delay(200);
    digitalWrite(10, HIGH); //b
    delay(200);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    delay(500);
    RArrow();
    delay(200);
    digitalWrite(10, HIGH); //b, copy 
    delay(200);
    RArrow();
    delay(200);
    digitalWrite(11, HIGH); //select
    delay(200);
    digitalWrite(12, HIGH); //paset
    delay(200);
    digitalWrite(12, LOW);  //paset
    delay(200);
    allLow();
    delay(300);
  }
}

void ScreenSwitch(){
  //move to randomly selected screen
  if(!TrueRandom.random(5)){
    allLow();
    digitalWrite(11, HIGH);
    delay(150);
    if(!TrueRandom.random(5)){
      if(UD){
        delay(150);
        digitalWrite(19, HIGH);
        delay(150);
        digitalWrite(19, LOW);
        delay(150);
      }else{
        delay(150);
        digitalWrite(18, HIGH);
        delay(150);
        digitalWrite(18, LOW);
        delay(150);
      }
      UD = !UD;
    }else{
      digitalWrite(TrueRandom.random(16, 18), HIGH);
      delay(150);
    }
    allLow();
  }
}

void tryToAvoidEMPTYandADD(){
  //press B to ga back out of LOAD screen..
  //press A to add something..
  if(!TrueRandom.random(10)){
    byte AB = 10;
    if(TrueRandom.random(2)){
      AB = 10;
    }else{
      AB = 12;
    }
    allLow();
    delay(150);
    digitalWrite(AB, HIGH);
    delay(150);
    digitalWrite(AB, LOW);
    delay(150);
    allLow();
  }
}

void RArrow(){
  //arrows..
  byte times = TrueRandom.random(1,8);
  for(byte j = times; j>0; j--){
    byte arrows = TrueRandom.random(16, 20);
    for(byte i=16; i<20; i++){
      if(TrueRandom.random(30)){
        if(arrows == i){
          digitalWrite(i, HIGH); 
        }else{
          digitalWrite(i, LOW); 
        }
      }else{
        digitalWrite(i, LOW); 
      }
    }
    delay(TrueRandom.random(1, 40));
  }
}

void RKeys(){
  //keys
  byte times = TrueRandom.random(1, 4);
  for(byte i = times; i>0; i--){
    if(TrueRandom.random(8)){
      if(TrueRandom.random(6)){
        digitalWrite(12, TrueRandom.random(2));
      }else{
        digitalWrite(10, TrueRandom.random(2));
        digitalWrite(12, TrueRandom.random(2));
      }
    }else{ 
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
    }
    delay(TrueRandom.random(1, 40));
  }
}

void startStop(){
  //start stop playback
  if(!TrueRandom.random(40)){
    allLow();
    delay(150);
    digitalWrite(9, HIGH);
    delay(150);
    digitalWrite(9, LOW);
    delay(150);
    allLow();
  }
}

void startAll(){
  //start stop playback
  if(!TrueRandom.random(40)){
    allLow();
    delay(150);
    digitalWrite(11, HIGH);
    delay(150);
    digitalWrite(9, HIGH);
    delay(150);
    digitalWrite(9, LOW);
    delay(150);
    digitalWrite(11, LOW);
    delay(150);
    allLow();
  }
}

void reset(){
  static unsigned long pState = 0;
  if(millis() - pState > 100000){
    randomSeed(analogRead(0));
    
    pState = millis();
    
    allLow();
    
    UD = true; //reset value, to prevent from moving to upper screens..
    
    digitalWrite(8, HIGH);
    delay(150);
    digitalWrite(8, LOW);
    delay(6500);
  } 
}

void allLow(){
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  
  digitalWrite(16, LOW);
  digitalWrite(17, LOW);
  digitalWrite(18, LOW);
  digitalWrite(19, LOW);
}