SD apertura pagine multiple

In sostanza nel mio web server ho una pagina iniziale (index.htm) con dei links e vorrei che, una volta aperto un link, lo sketch riconosca e apra in automatico la pagina. Sono riuscito a farlo, modificando l’esempio “listfiles” in questo modo:

            while (true) {
              File entry =  root.openNextFile();
                if (!entry) break;

                if (message.indexOf(entry.name()) > 0) {
                  file = SD.open(entry.name());
                }

              entry.close();
            }

Il problema è che i nomi delle pagine all’interno del pointer “entry.name()” sono tutte in maiuscolo, quindi sono costretto a scrivere il nome delle pagine in maiuscolo. C’è modo di averle in minuscolo? Intanto vi posto tutto il codice. Grazie per l’aiuto!

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 55 };
EthernetServer server(80);
File file;
File root;
int maxLength = 20;
String message;

void setup() {
  pinMode(4, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(4, HIGH);
  digitalWrite(10, HIGH);

  if (!SD.begin(4)) return;

  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {
  EthernetClient client = server.available();

  if (client) {
    boolean blank = true;

    while (client.connected()) {
      if (client.available()) {
        char characters = client.read();

        if(message.length() < 20) {
          message += characters;
        }

        if (characters == '\n' && blank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();

          file = SD.open("header.htm");

          if (file) {
            while (file.available()) {
              client.write(file.read());
            }

            file.close();
          }
 
          root = SD.open("/");

          if (message.indexOf("/ ") > 0 || message.indexOf("index.htm") > 0) {
              file = SD.open("index.htm");
          } else {
            while (true) {
              File entry =  root.openNextFile();
                if (!entry) break;

                if (message.indexOf(entry.name()) > 0) {
                  file = SD.open(entry.name());
                }

              entry.close();
            }
          }

          if (file) {
            while (file.available()) {
              client.write(file.read());
            }

            file.close();
          }

          file = SD.open("footer.htm");

          if (file) {
            while (file.available()) {
              client.write(file.read());
            }

            file.close();
          }

          break;
        }

        if (characters == '\n') {
          blank = true;
        } else if (characters != '\r') {
          blank = false;
        }
      }
    }

    delay(1);
    client.stop();
    message = "";
  }
}

Credo che ritorna i nomi secondo il vecchio dos, 8+3 caratteri e perciò in maiuscolo (FAT16)
C'e' modo di convertire in minuscolo, ma dovresti passare da un array di caratteri intermedio e mettendoci dentro i singoli caratteri togliendogli 'a'-'A' ovvero 97-65 quindi 32 (tranne il carattere punto)

Niente, non riesco proprio a passare i caratteri ad un array singolarmente. Tra l'altro mi sono accorto che se prima di quel while apro anche un solo file (tramite SD.open()), mi da solo i primi 4 files e ignora gli altri.
Mi sa che devo trovare un altro metodo... grazie comunque per l'aiuto :slight_smile:

Ti scrivi una piccola funzione a cui passi entry.name() e ti restituisce il nome in maiuscolo.

Per fare questo, fai un FOR che prende carattere a carattere e lo da in pasto alla funzione toupper(), che fa parte di AVR libc ed in particolare di <ctype.h>, che te lo restituisce maiuscolo.

Guglielmo

Il problema è che non riesco ad aggiungere i caratteri in un nuovo pointer o in un array. Facendo in questo modo invece:

File root = SD.open("/");

while(true) {
    file = root.openNextFile();
    if(!file) break;
    len = strlen(file.name());

    for(int i=0; i<len; i++) {
      file.name()[i] = tolower(file.name()[i]);
    }

if (message.indexOf(file.name()) > 0) {
  file = SD.open(file.name());
}
}

Effettivamente le pagine diventano minuscole e stampando file.name() me lo stampa tutto minuscolo, però quando vado a fare message.indexOf(file.name()), per poter aprire la pagina, non succede nulla… come se non lo riconoscesse. Ho provato anche in questo modo:

             for(int i=0; i<len; i++) {
                if (file.name()[i] == '.') {
                  file.name()[i] = '.';
                } else {
                  file.name()[i] = file.name()[i]+'a'-'A';
                }
              }

Ma stessa cosa… se stampo file.name(), mi stampa il nome della pagina tutto minuscolo, ma quando poi vado ad aprirla mi da pagina bianca.

Perchè secondo me anche SD.open() vuole i nomi in maiuscolo.
Però, non è che tu metti i file con nomi lunghi su una SD FAT16 che accetta solo nomi corti? Quindi il sistema cambia i nomi in maiuscolo e solo in maiuscolo li riconosce?

Se guardi la lib tinywebserver.cpp dentro c’è proprio quello che chiedi, riconoscimento del tipo di file prelevando l’estensione, il nome del file facendo la decodifica con “toupper” per poi fare il send al client.

Se non la vuoi usare per intero, puoi sempre prendere spunto
https://github.com/ovidiucp/TinyWebServer/blob/master/TinyWebServer.cpp

ciao

nid69ita:
Perchè secondo me anche SD.open() vuole i nomi in maiuscolo.
Però, non è che tu metti i file con nomi lunghi su una SD FAT16 che accetta solo nomi corti? Quindi il sistema cambia i nomi in maiuscolo e solo in maiuscolo li riconosce?

No no, funziona anche con i nomi in minuscolo, infatti quando apro "index.htm" o "header.htm" funziona, credo il problema sia perchè modifico file.name() invece di inserire i caraterri in un nuovo array, ma ho provato e non riesco :D.
Il problema della lunghezza l'avevo avuto all'inizio :P, poi per sicurezza li ho accorciati tutti a 3 caratteri, infatti se li apro normalmente, scrivendo io stesso il nome, funziona.

pablos:
Se guardi la lib tinywebserver.cpp dentro c'è proprio quello che chiedi, riconoscimento del tipo di file prelevando l'estensione, il nome del file facendo la decodifica con "toupper" per poi fare il send al client.

Do subito un'occhiata, grazie mille :smiley:

Con tinyweb funziona tutto alla grande :), ora mi rimane solo eliminare il superfluo :D. Grazie a tutti