Go Down

Topic: Navigation im Dateiverzeichnis der SD-Karte und Anzeige auf LCD (Read 475 times) previous topic - next topic

Hallo,

ich möchte gerne im Verzeichnis der SD-Karte navigieren. Hierzu soll
über Tastendruck
- Rechts in ein Unterverzeichnis springen
- Links ein Unterverzeichnis verlassen
- Hoch/Runter die vorherige/nächste Datei angezeigt werden.
- Select die Datei ausgewhählt werden und weiterverarbeit werden können.

Hierbei soll auf einer LCD-Anzeige jeweils das Verzeichnis und der Dateiname angezeigt werden.  "/V1/V12/File.txt"
Die Ausgabe soll hierbei alphabetisch sortiert sein.

Hat hier jemand schon eine Idee / Snippets?

Vielen Dank im Voraus

Joachim

uwefed

#1
May 19, 2013, 06:43 pm Last Edit: May 19, 2013, 09:24 pm by uwefed Reason: 1
Die einzige Idee die ich habe ist das gesamte Inhaltsverzeichniß zu lesen, zu sortieren und großteils im RAM zu halten.
Dazu brauchst Du viel RAM.

Grüße Uwe

rudirabbit

Hi  subcamera,
Schau dir mal an wie ein Verzeichnisbaum unter Windows gelesen wird.
Das ist rekursiver Code, mit findfirst findnext.... die es so in der SD Lib nicht gibt.

Diese muß man also erst mit hilfe der SD Lib erst hinzufügen.

Unter Win Umgebung wird dies  in einer treeview class gespeichert, sowas müsste man unter Arduino nachbauen.

Also nicht so einfach ...

Arduino UNO,MEGA  Fremdgänger mit dem  Nucleo L152RE   
Dunkel die andere Seite ist. - Klappe, Yoda, und iss deinen Toast :-)

Jomelo

Ein Tree (Nested-Set-Model) wurde hier im Forum schon in verschiedenen Libs verwendet. Aber diese Libs sind darauf ausgelegt mit statischen Objekten zu arbeiten und so wenig wie möglich im Ram zu belegen. Du könntest diese Libs umschreiben so das sie auch mit dynamischen Objekten umgehen können. Dies kostet so wie Uwe schon gesagt sehr viel Ram. Effektiv könntest du vielleicht 10 Ordner mit 10 Dateien darstellen, anschließend hast du zu wenig Speicher.

Die andere Frage ist, wie viel Zeit willst du in das Projekt stecken, ich schätze wenn du die Lib selbst schreiben musst, bist du wohl 20-40 Stunden am Programmieren und weißt anschließend erst ob es auch mit mehr als 10 Ordnern und Dateien funktioniert.

jurs


Effektiv könntest du vielleicht 10 Ordner mit 10 Dateien darstellen, anschließend hast du zu wenig Speicher.


Man muss nicht alles im RAM-Speicher halten, wenn man für ein System mit extrem wenig RAM-Speicher programmiert!

Eine SD-Karte hat genug Speicher für einige sortierte Dateilisten, genauer gesagt eine Dateiliste pro Verzeichnis.

So geht's:
Ein 8.3 Dateiname belegt 12 Bytes.
Bevor das Programm einen Dateinamen aus einem Verzeichnis anzeigt, läßt man eine Initialisierungsroutine laufen.

Pro Verzeichnis wird zunächst eine "versteckte Datei" mit einer Dateiliste angelegt, in der alle Dateien des Verzeichnisses drinstehen. Dateiname z.B. sdidx.txt (diese versteckte Datei wird aber NICHT mit in die Dateiliste geschrieben). Die Dateiliste in sdidx.txt wird an Ort und Stelle sortiert, durch Tauschen von je 12 und 12 Bytes mit Dateinamen.

Und zum Anzeigen der nun sortierten Dateiliste wird jetzt einfach die Datei sdidx.txt geöffnet und immer ein Dateiname angezeigt. Erster Dateiname steht in den ersten 12 Bytes, zweiter Dateiname in den zweiten 12 Bytes, dritter Dateiname ...

Wenn ein ausgewählter Name ein Verzeichnisname ist, wird ins entsprechende Unterverzeichnis gewechselt und dort die versteckte Datei initialisiert/geöffnet. Wenn ein ausgewählter Name kein Verzeichnis- sondern ein Dateiname ist, ist dieser Name ausgewählt.

An RAM-Speicher werden im wesentlichen dreimal 12 Bytes benötigt, weil man nie mehr als drei Dateinamen gleichzeitig im Speicher halten muß, egal wieviele Dateien auf der SD-Karte sind, also auch nicht bei 100 Dateien in 1000 verschiedenen Ordnern. Plus die Bytes, die der maximalen Dateipfadlänge entsprechen, um auch den kompletten Dateipfad zu verwalten. Plus vielleicht ein abschließendes Nullzeichen an jedem der vier char-Arrays, um bequem die C-Stringfunktionen verwenden zu können (z.B. zum Vergleichen von Dateinamen beim Sortieren).

Speichermangel gibt es dabei nicht, sofern nicht der Speicher auf der SD-Karte ausgeht.

BTW: Auch ein "Tree (Nested-Set-Model)" kann man im wesentlichen auf Massenspeicher anlegen, so dass man sich durch eine sehr große Datenstruktur hangeln kann, ohne dabei viel RAM-Speicher zu benötigen.

Go Up