        #include <SPI.h>       
        #include <SdFat.h>
        #include <SdFatUtil.h>
        #include <Ethernet.h>
        #include <LiquidCrystal.h>

        byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
        byte ip[] = { 192, 168, 1, 177 };
        char rootFileName[] = "index.htm";
        Server server(80);
        LiquidCrystal lcd(7, 6, 5, 8, 3, 2);
        /************ SDCARD STUFF ************/
        Sd2Card card;
        SdVolume volume;
        SdFile root;
        SdFile file;
        
   boolean skuare;
   boolean sirkle;
   boolean triangl;   


          
        // store error strings in flash to save RAM
        #define error(s) error_P(PSTR(s))

        void error_P(const char* str) {
          PgmPrint("error: ");
          SerialPrintln_P(str);
          if (card.errorCode()) {
            PgmPrint("SD error: ");
            Serial.print(card.errorCode(), HEX);
            Serial.print(',');
            Serial.println(card.errorData(), HEX);
          }
          while(1);
        }
byte cuadra[8] = {
	B00000,
	B11111,
	B10001,
	B10001,
	B10001,
	B10001,
	B11111,
	B00000
};

byte triangulo[8] = {
	B00000,
	B00100,
	B01010,
	B01010,
	B10001,
	B10001,
	B11111,
	B00000
};

byte circulo[8] = {
	B00000,
	B01110,
	B10001,
	B10001,
	B10001,
	B10001,
	B01110,
	B00000
};
        void setup() {
          Serial.begin(9600);
          
  lcd.createChar(0, cuadra);
  lcd.createChar(1, triangulo);
  lcd.createChar(2, circulo);
  
    lcd.begin(16, 2);
    lcd.print("turn knob...");
          PgmPrint("Free RAM: ");
          Serial.println(FreeRam());
         
          // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
          // breadboards.  use SPI_FULL_SPEED for better performance.
          pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
          digitalWrite(10, HIGH);                    // but turn off the W5100 chip!

          if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
         
          // initialize a FAT volume
          if (!volume.init(&card)) error("vol.init failed!");

          PgmPrint("Volume is FAT");
          Serial.println(volume.fatType(),DEC);
          Serial.println();
         
          if (!root.openRoot(&volume)) error("openRoot failed");

          // list file in root with date and size
          PgmPrintln("Files found in root:");
          root.ls(LS_DATE | LS_SIZE);
          Serial.println();
         
          // Recursive list of all directories
          PgmPrintln("Files found in all dirs:");
          root.ls(LS_R);
         
          Serial.println();
          PgmPrintln("Done");
         
          // Debugging complete, we start the server!
          Ethernet.begin(mac, ip);
          server.begin();
        }

        // How big our line buffer should be. 100 is plenty!
        #define BUFSIZ 100
        

void loop () {
  int shape;
    int pot = analogRead(0);

    if ((pot > 0)&&(pot < 100)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(0);
   lcd.write(1);
   lcd.write(1);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.setCursor(0,1);
   lcd.write(1);
   lcd.write(0);
   lcd.write(1);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(1);
   lcd.write(0);
   lcd.write(0);
   lcd.write(1);
   lcd.write(0);
   lcd.write(1);
   lcd.write(0);
   lcd.write(0);
       delay(40);
       shape = 5;
    }     


if ((pot > 101)&&(pot < 200)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.setCursor(0,1);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
       delay(40);
       shape = 0;
    }     
    
    if ((pot > 201)&&(pot < 300)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(0);
   lcd.write(0);
   lcd.write(1);
   lcd.write(0);
   lcd.write(1);
   lcd.write(0);
   lcd.write(0);
   lcd.setCursor(0,1);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(1);
   lcd.write(1);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
       delay(40);
       shape = 5;
    }     
    
    if ((pot > 301)&&(pot < 400)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.setCursor(0,1);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
       delay(40);
       shape = 5;
    }     
    
    if ((pot > 401)&&(pot < 500)) {
        lcd.clear();
  lcd.setCursor(0,0);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.setCursor(0,1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
        delay(40);
        shape = 1;
      }
    if ((pot > 501)&&(pot < 600)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.setCursor(0,1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
   lcd.write(2);
   lcd.write(0);
       delay(40);
       shape = 5;
    }     
    
    if ((pot > 601)&&(pot < 700)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.write(1);
   lcd.setCursor(0,1);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
       delay(40);
       shape = 5;
    }     
    
    if ((pot > 701)&&(pot < 800)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.setCursor(0,1);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
   lcd.write(0);
       delay(40);
       shape = 5;
    }     
   if ((pot > 801)&&(pot < 900)) {
         lcd.clear();
  lcd.setCursor(0,0);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.setCursor(0,1);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
   lcd.write(2);
         delay(40);
         shape = 2;
       }  
    if ((pot > 901)&&(pot < 1024)) {
       lcd.clear();
 lcd.clear();
   lcd.setCursor(0,0);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.setCursor(0,1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
   lcd.write(0);
   lcd.write(1);
   lcd.write(2);
       delay(40);
       shape = 5;
    }     


      
     
      
  
  
  
  
          char clientline[BUFSIZ];
          char *filename;
          int index = 0;
          int image = 0;

          Client client = server.available();



          if (client) {      


            // an http request ends with a blank line
            boolean current_line_is_blank = true;

            // reset the input buffer
            index = 0;
           
            while (client.connected()) {

              if (client.available()) {
                char c = client.read();
               

             Serial.println(shape);
                // If it isn't a new line, add the character to the buffer
                if (c != '\n' && c != '\r') {
                  clientline[index] = c;
                  index++;

                  // are we too big for the buffer? start tossing out data
                  if (index >= BUFSIZ)
                    index = BUFSIZ -1;

                  // continue to read more data!
                  continue;
                }

                // got a \n or \r new line, which means the string is done
                clientline[index] = 0;
                filename = 0;
               
                // Print it out for debugging
                Serial.println(clientline);

                // Look for substring such as a request to get the root file
                if (strstr(clientline, "GET / ") != 0) {
                  filename = rootFileName;

                }
                if (strstr(clientline, "GET /") != 0) {
                  // this time no space after the /, so a sub-file

                  if (!filename) filename = clientline + 5; // look after the "GET /" (5 chars)
                  // a little trick, look for the " HTTP/1.1" string and
                  // turn the first character of the substring into a 0 to clear it out.
                  (strstr(clientline, " HTTP"))[0] = 0;

                  // print the file we want
                  Serial.println(filename);

                  if (! file.open(&root, filename, O_READ)) {
                    client.println("HTTP/1.1 404 Not Found");
                    client.println("Content-Type: text/html");
                    client.println();
                    client.println("<h2>keep turning the knob and scanning the codes</h2>");
                    break;
                  }
                                                   
                  Serial.println("Opened!");

                  client.println("HTTP/1.1 200 OK");
                  if (strstr(filename, ".htm") != 0)
                     client.println("Content-Type: text/html");
                  else if (strstr(filename, ".jpg") != 0)
                     client.println("Content-Type: image/jpeg");
                 else if (strstr(filename, ".gif") != 0)
                     client.println("Content-Type: image/gif");
                 else
                     client.println("Content-Type: text");

                  client.println();                                                                 



  if ((strstr(filename, "one.htm") !=0)&&(shape==0)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/sq1.htm'>");
      client.println("</head>");

      }
      
 if ((strstr(filename, "one.htm") !=0)&&(shape==1)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/tr1.htm'>");
      client.println("</head>");

  }
if ((strstr(filename, "one.htm") !=0)&&(shape==2)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/cir1.htm'>");
      client.println("</head>");

      }
      
if ((strstr(filename, "two.htm") !=0)&&(shape==0)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/sq2.htm'>");
      client.println("</head>");

      }      
if ((strstr(filename, "two.htm") !=0)&&(shape==1)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/tr2.htm'>");
      client.println("</head>");

      }     
     
if ((strstr(filename, "two.htm") !=0)&&(shape==2)){  
     client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/cir2.htm'>");
      client.println("</head>");

      }      
      
if ((strstr(filename, "three.htm") !=0)&&(shape==0)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/sq3.htm'>");
      client.println("</head>");

      }      
      
if ((strstr(filename, "three.htm") !=0)&&(shape==1)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/tr3.htm'>");
      client.println("</head>");


      }     
      
if ((strstr(filename, "three.htm") !=0)&&(shape==2)){  
      client.println("<head>");
      client.println("<meta HTTP-EQUIV='REFRESH' content='0; url=http://192.168.1.177/cir3.htm'>");
      client.println("</head>");

      }      
     
     
     
      
   ////   

                  int16_t c;
                  while ((c = file.read()) >= 0) {
                      // uncomment the serial to debug (slow!)
                      //Serial.print((char)c);
                      client.print((char)c);

                  }
                  file.close();
                } else {

                  // everything else is a 404
                  client.println("HTTP/1.1 404 Not Found");
                  client.println("Content-Type: text/html");
                  client.println();
                  client.println("<h2>keep turning the knob and scanning the codes</h2>");
                }

      
                break;
              }
            }
            // give the web browser time to receive the data
            delay(1);

            client.stop();
            
          }                        
        }


  


