Prvi mikro projekt prikazat će kako kreirati datoteku na X-u (file writing), dok će drugi projekt dati prikaz sadržaja zapisanih datoteka (file listing), na našem mikro X serveru. Projekti su namijenjeni početnicima koji prvi puta ulaze u svijet X-a, dok za naredne brojeve pripremamo nešto složenije primjere manipulacije tipovima datoteka korištenjem server biblioteka i to putem web browsera.
Kreiranje datoteka
Kao programsku platformu za razvoj ovog pokaznog projekta koristili smo poznati Arduino IDE i to u verziji 1.8.10. Za početak pisanja kôda smo učitali potrebne biblioteke (libraries), a sam projekt proširili smo djelomično tako da se status, osim u Serial Monitoru Arduino IDE-a, ispisuje i na TFT ekran našeg X-a, a što smo pojasnili u prethodnom broju.
#include <SPIFFS.h>
- biblioteka Flash datotečnog sustav serijskog perifernog sučelja (SPIFFS)
#include <Adafruit_GFX.h>
- jezgrena biblioteka svih grafičkih biblioteka
#include <Adafruit_ILI9341.h>
- biblioteka s funkcijama koje definiraju i upravljaju TFT ekranom
O SPI sustavu datoteka (SPIFSS)
U proteklom projektu web servera, ako se prisjećate, HTML i CSS kod pisali smo izravno u naš Arduino IDE i tako ga kompajlirali. Međutim, integracija HTML-a i CSS-a na jednom mjestu unutar source kôda čini kod težim za čitanje a i vrlo brzo bi mogli ostati bez memorije. Flash datotečni sustav serijskog perifernog sučelja ili skraćeno SPIFFS predstavlja datotečni sustav za mikrokontrolere sa SPI flash čipom. Ugrađeni flash čip ima dovoljno prostora za smještaj malih datoteka, posebno s verzijama od 2 ili 4 MB. Posebnost SPIFFS-a je mogućnost pristupa flash memoriji slično kao što to činimo na „standardnim“ datotečnim sustavima (primjerice FAT32, NTFS,….). Uporaba biblioteke SPIFFS #include <SPIFFS.h> daje našem serveru mogućnost manipulacije datotekama tako da ih možemo kreirati, pregledavati, prebacivati i slično. Sljedeći izraz provjerava proces mountanja datotečnog sustava:
if(!SPIFFS.begin(true)){
Serial.println("Greška u pripremi datotečnog sustava");
return;
Ako mountanje prođe u redu, naš je server spreman za zapis datoteka. Ako ne, prikazat će se greška i proces kreiranja datoteke će se zaustaviti. Za potrebe testa kreirat ćemo tekstualnu datoteku VIDI.txt, a kako bismo istu i zapisali koristit ćemo konstantu FILE_WRITE. Kod u nastavku prikazuje metodu koja vraća objekt klase file koji će se koristiti prilikom kreiranja testne datoteke VIDI.txt.
File file = SPIFFS.open("/VIDI.txt", FILE_WRITE);
Kao provjeru za uspješnost kreiranja i otvaranje testne datoteke koristit ćemo izraz:
if(!file){
Serial.println("Greška prilikom kreiranja datoteke");
return;
}
Nakon uspješnog kreiranja i otvaranja testne datoteke, iskoristiti ćemo naredbu print za upis teksta “Neki tekst u VIDI testu”. Pozivanjem funkcije file.close zatvaramo našu datoteku.
if(file.print("Neki tekst u VIDI testu")) {
Serial.println("Datoteka uspješno zapisana");
}else {
Serial.println("Neuspješan zapis");
}
file.close();
Uporaba biblioteke SPIFFS #include <SPIFFS.h> daje našem serveru mogućnost manipulacije datotekama tako da ih možemo kreirati, pregledavati, prebacivati i slično
Modificirana verzija primjera za zapis datoteka na SPIFFS datotečni sustav proširena s funkcijom ekranskog prikaza statusa zapisa
Prikaz kreiranih datoteka i mapa
Nakon što smo kreirali i upisali sadržaj u našu testnu, tekstualnu datoteku, sada ćemo prikazati mogućnost file listinga unutar našeg SPIFFS datotečnog sustava i to kroz sljedeći mikro projekt:
Izvorni kod primjera projekta file listinga. Projekt smo također započeli pozivanjem SPIFFS biblioteke <SPIFFS.h>, što je preduvjet za bilo kakvu manipulaciju s datotečnim sustavom tj. Kako bismo imali pristup svim funkcionalnostima
https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/.
Važno!
SPIFFS datotečni sustav ne podržava kreiranje i operacije s direktorijima. Ako se kreira datoteka s putanjom /neki_direktorij/datoteka.txt, stvorit će se datoteka s punim nazivom “/neki_direktorij/datoteka.txt”.
File root = SPIFFS.open(“/”);
- Kako direktoriji zapravo ne postoje u SPIFFS-u, ovim izrazom dobiti ćemo sve datoteke koje se trenutno nalaze u datotečnom sustavu i to počevši od "/", bez obzira na duljinu drugih znakova. Oznaka "/" postoji u njihovim imenima simulirajući ugniježđene foldere.
File file = root.openNextFile();
- Nakon imenovanja i kreiranja datoteke, ponovno se poziva metoda openNextFile sve dok u datotečnom sustavu ima datoteka.
file = root.openNextFile();
- Na kraju kôda koristimo navedeni izraz i koristimo file objekt kako bismo zaustavili izvođenje petlje nakon izlistâ svih datoteka.
Alati koji život znače
Kako bi jednostavnije prebacivali datoteke na mikrokontroler platformu, postoji nešto što se zove Arduino ESP32 Filesystem Uploader, a dostupan je na githubu na linku https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/.
Radi se o dodatku (pluginu) za Arduino IDE, a omogućava prijenos datoteka izravno na SPIFFS datotečni sustav i to izravno iz mape s korisničkog računala.
Instalacija Filesystem Uploadera je jednostavna, a potrebno je raspakirati skinuti fajl u direktorij gdje je instaliran Arduino IDE te raspakirani .jar (java) file smjestiti u mapu Tools (Tool) te restartati IDE. Nakon toga u izborniku Tools bi se trebala pojaviti nova opcija.
Može li drugačije?
Na Githubu pronašli smo Async Web Server biblioteku koja nam omogućava podešavanje ruta na kojima će naš poslužitelj slušati dolazne HTTP zahtjeve i izvršavati zahtijevane funkcije na toj ruti. Prevedeno, kada poslužitelj primi zahtjev klijenta na korijenskom URL-u “/”, isti odgovara slanjem index.html datoteke prema klijentu. To znači da nakon kreiranja zasebnih .html i .css datoteka na računalu npr., iste prebacimo na naš X, a funkcija server.on u source kodu Arduino IDE-a odradit će ostalo (pri tome ne miješamo html/css kod s izvornim kodom prilikom kompajliranja, već se on nalazi zasebno u html/css datotekama). Kao primjer može se navesti dio izvornog kôda Async Web Server biblioteke korištenjem on metode na server objektu:server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/index.html", String(), false, processor);
});
Za kraj
Ovim mikro primjerima pokazali smo kako manipulirati datotekama na našem X-u. SPIFFS nije idealan, ali je upotrebljiv uz sva svoja ograničenja. Pri tome ne treba zaboraviti da se radi o vrlo ograničenom memorijskom prostoru za pohranu datoteka i da je zona komfora poprilično skučena u odnosu na današnje memorijske veličine. Kao nedostatak istaknimo nemogućnost rada s direktorijima, barem ne na onakav način na koji smo navikli. Ipak, za pomoć postoje alati poput Filesystem Uploader-a koji nam mogu olakšati rad s datotekama.
Primjere koda potražite na linkovima:
https://github.com/VidiLAB-com/Vidi-X/tree/master/SPIFFS_list_files
https://github.com/VidiLAB-com/Vidi-X/tree/master/SPIFFS_make_file