SPIFFS / SDFS fileTime en/of getLastWrite.

Software vragen voor ESP chip familie
Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor zuid » 23 Dec 2019, 18:51

Ik probeer een bestanden lijst webpagina te maken voor zowel SPIFFS als voor SDFS.
Volgens de documetatie van het file systeem
https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html
is er een (datum) tijd, van de laatste WRITE beschikbaar per bestand.
Het is me echter nog niet gelukt dit ook zichtbaar te maken.
Heeft iemand dit al eens wel goed kunnen programmeren.
Volgens de documentatie zijn er twee variant voor het ophalen van die wijzigingsdatum.
Beide geven bij mij een NUL.
m.v.g Nico
Code: Alles selecteren
// MENU  en  SPIFFS  bestand lijst    =================================================================
void handleMenu() {
 
  webServer =  "<!DOCTYPE html>\n"
               "<html>\n"
               "<head>\n"
               "  <link rel=\"stylesheet\" href=\"styl1.css\">"
               "  <link rel=icon href=/favicon.ico type=image/x-icon>"
               "  <title>Menu</title>\n"
               "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
               "<body>\n"               
               "<table class=\"center\"><tr><td class=\"groot\" colspan=3> MENU </td></tr>\n"
               "<tr><th class=\"kleinL\">Naam</th><th class=\"kleinL\">Omschrijving</th><th></th></tr>\n"
               
               "<tr><td class=\"klein\"><form action=/menu><input type=submit value=menu size=8></form></td>\n"
               "<td class=\"klein\">Dit menu</td></tr>\n"
               
               "<tr><td class=\"klein\"><form action=/menu>\n"
               "<input type=hidden name=delete value=del>\n"
               "<input type=submit value=menu size=8></form></td>\n"
               "<td class=\"klein\">Idem, met file delete functie</td></tr>\n"
               
               "<tr><td class=\"klein\"><form action=/weer><input type=submit value=weer></form></td>\n"
               "<td class=\"klein\">Pagina met actueel weer</td></tr>\n"
               "<tr><td class=\"klein\"><form action=/grafiek><input type=submit value=grafiek></form></td>\n"
               "<td class=\"klein\">24 uurs temperatuur grafiek</td></tr>\n"
               "<tr><td class=\"klein\"><form action=/status><input type=submit value=status></form></td>\n"
               "<td class=\"klein\">Pagina met de status van het programma</td></tr>\n"             
               "</table><br>\n"
               "<table class=\"center\"><tr><td colspan=4 class=\"groot\"> BESTANDEN </td></tr>\n"
               "<tr><th class=\"kleinL\">Naam</th><th>Gewijzigd op</th><th>Grootte</th></tr>\n";
 
  Dir dir = SPIFFS.openDir("/");
  while (dir.next()) {
    webServer += "<tr><td class=\"klein\"><a href=\n";
    webServer += dir.fileName();
    webServer += ">";
    webServer += dir.fileName();
    webServer += "</a></td><td class=\"klein\">";
   
    File f = dir.openFile("r");
    webServer += f.getLastWrite();     //    VARIANT 1
    webServer += "&nbsp\;"; 
    webServer += dir.fileTime();          //   VARIANT 2   
    f.close();
   
    webServer += "</td><td class=\"klein\">\n";
    webServer += dir.fileSize();
    webServer += "</td>\n";
    if(server.arg(0) == "del"){
    webServer += "<td><form action=/update >"
                 "<input type=hidden name=delete value=\"";
    webServer += dir.fileName();
    webServer += "\">\n<input type=submit value=delete>\n"
                 "</form></td>\n";
    }             
    webServer += "</tr>\n";            }
                 
    webServer += "</table><br>"
                 "<table class=\"center\"><tr><td class=\"groot\">UPLOAD</td></tr>\n"
                 "<tr><td>\n"
                 "<form action=/update method=\"post\" enctype=\"multipart\/form-data\">\n"
                 "<input type=\"file\" name=\"name\" required><br>\n"
                 "<input type=submit value=Upload></form>\n"
                 "</td></tr>\n"; 
  webServer += "</table></body></html>\n";
  server.send(200, "text/html", webServer);
}

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor Gij Kieken » 23 Dec 2019, 20:28

Hallo ,Zuid
Zelf heb ik het nog niet geprobeerd maar moet je niet eerst een setTimeCallback functie oproepen om dit te kunnen verkrijgen?

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor zuid » 23 Dec 2019, 20:54

Volgens de documentatie zou dat niet nodig zijn.
setTimeCallback(time_t (*cb)(void))
If your app sets the system time using NTP before file operations, then you should not need to use this function.

Niet nodig maar het helpt ook niet. In mijn programma heb ik dat ook geprobeerd.
Ik kan helaas ook nergens een voorbeeld vinden.
m.v.g. Nico

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor Koepel » 24 Dec 2019, 08:01

Met de ESP32 werkt het wel.
Deze functies gebruikte ik: https://github.com/espressif/arduino-esp32/blob/master/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino.
Ik heb een bestand geupload via de "Sketch Data Upload" vanuit de Arduino IDE volgens dit: https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/.

Bij een upload vauit de Arduino IDE is de tijd van een bestand helaas 0.
Vanuit de ESP32 bleef de tijd in eerste instantie ook 0.

Pas nadat ik de ESP32 op de juist tijd had gezet met hulp van een NTP server en ik deed bijvoorbeeld een append aan een bestand vanuit de ESP32, dan pas staat de tijd van het bestand er in.

Het voorbeeld "SPIFFS_time.ino" zet vanzelfsprekend ook eerst de tijd, en pas daarna worden de testen met het bestand gedaan. Op die manier werkt het.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor zuid » 24 Dec 2019, 09:37

NTP tijd wordt bij mij ook als eerste gezet.
Maar ook heb ik de Callback functie opgenomen.
Append had ik nog niet geprobeerd. Zojuist dat ook nog even getest, maar helaas geen resultaat.
Ik heb nu drie varianten zonder resultaat.
1.Upload via een http POST.
2.Nieuw bestand (open w+)
3.Append bestaand bestand (open a)
Wie heeft een werkend voorbeeld voor een ESP8266 :)
m.v.g. Nico

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor Koepel » 24 Dec 2019, 10:23

Ook de ESP8266 werkt.

In het menu zit dit voorbeeld: https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/examples/LittleFS_Timestamp/LittleFS_Timestamp.ino.
Daar vulde ik mijn Wifi naam en wachtwoord in en ik wijzigde de NTP:
Code: Alles selecteren
configTime(3600 * timezone, daysavetime * 3600, "pool.ntp.org");

Dat werkte ook.

Bij de ESP32 kun je kiezen uit een standaard SPIFFS en een LittleFS voor het interne geheugen. Bij de ESP8266 lijkt er alleen de LittleFS te zijn.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor zuid » 24 Dec 2019, 10:47

Die had ik nog niet gevonden. Ik had wel SDFS variant ook geprobeerd echter ook nog zonder resultaat.
Nu maar eens met het LittleFS voor beeld aan de slag.
Dank voor het mee zoeken/helpen.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor zuid » 24 Dec 2019, 15:10

Het LittleFS voorbeeld werkt bij mij (meestel) ook.
Ik zie in de code van dit voorbeeld nog wel iets wat ik niet begrijp.

Er staat:
Code: Alles selecteren
configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");

Dit lijkt mij het oproepen van de functie configTime(parameter1, parameter2, parameter3 ……);
Alleen kan ik niet vinden waar deze functie daadwerkelijk staat.
Niet in de code van het voorbeeld maar ook niet in de #include van time.h
Ik probeer te begrijpen hoe de NTP tijd wordt geregeld.
De hier gebruikte manier was ik nog niet eerder tegen gekomen.
Wie helpt?
m.v.g. Nico

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor Koepel » 24 Dec 2019, 15:50

Vul gewoon de NTP server in zoals ik al schreef:
Code: Alles selecteren
configTime(3600 * timezone, daysavetime * 3600, "pool.ntp.org");

De tijdzone klopt volgens mij niet, maar dat mag je zelf oplossen.

Hier schreef ik al: "zo eenvoudig kan het zijn": http://arduinoforum.nl/viewtopic.php?f=8&t=4088#p27354. Dus je had het kunnen weten ;) Dat voorbeeld zit er al een tijdje bij.

Het lijkt er op dat de ESP32 en ESP8266 omgeving de functie prototyping hebben toegevoegd aan "Arduino.h".
Bij de ESP8266 zit de functie zelf in "time.cpp" en bij de ESP32 in "esp32-hal-time.c".

Je kunt zelf de bestanden vinden waar configTime wordt gebruikt: https://www.google.nl/search?q=site%3Agithub.com%2Fesp8266%2FArduino%2Fblob%2Fmaster%2Fcores%2Fesp8266%2F+configTime

Documentatie ? Doe iets met de tijdzone, iets met zomer/winter-tijd en een NTP server. Dat is het zo'n beetje.

Er zijn inmiddels veel verschillende "time" libraries. Dit is echt iets van de ESP32 en ESP8266 omgeving zelf.
Volgens mij is het goed opletten om ze niet door elkaar te gebruiken.
Dit zijn volgens mij de meest gangbare:
- TImeLib (onderhouden door Paul Stoffregen)
- RTClib (Adafruit)
- De standaard 'time' zoals die al heel lang bij de 'c' taal hoort. Die kan tegenwoordig door de GNU C++ compiler meegelinkt worden voor de Arduino boards.
- De officiële RTC library voor de Arduino Zero/MKR/M0, gemaakt en onderhouden door Arduino.
- De ESP32/ESP8266 time.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: SPIFFS / SDFS fileTime en/of getLastWrite.

Berichtdoor zuid » 24 Dec 2019, 16:32

Ik had in de librarys gezocht.
Dus kennelijk een niveau te diep.
Met tijdzone, zomer en wintertijd enz had ik geen probleem.
Ik probeer alleen te begrijpen wat er gebeurt en of ik kan vinden hoe en hoe vaak de tijd wordt gesynchroniseerd.
In het voorbeeld is er alleen een Setup. Als een programma altijd moet werken moet ook af en toe de klok gelijk gezet worden. Zomaar een kopie maken is voor mij geen optie.
En.. alles lezen gaat al niet laat staan alles onthouden. :)
m.v.g.Nico

Volgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten