Discussion:
[ethersex-devel] vfs_sd_chdir
Meinhard Ritscher
2015-06-25 12:19:06 UTC
Permalink
Hallo Zusammen,

ich lese schon seit ein paar Tagen den Code für den Zugriff auf die SD-Karte
aber ich komme nicht weiter.
Was genau macht die Funktion hardware/storage/vfs_sd.c -> vfs_sd_chdir() ?

Wenn ich versuche, eine Datei in einem Unterverzeichnis anzulegen, geht es auf
diese Weise schief:

uint8_t filelogger_init (const char *dirname, char *filename)
{
// dirname = "xyz"
struct fat_dir_struct * dir_struct;
if ( ( dir_struct = vfs_sd_chdir(dirname)) == NULL)
{
vfs_sd_mkdir_recursive( dirname );
vfs_sd_chdir(dirname);
}

// filename = "/xyz/1234.txt";
struct vfs_file_handle_sd_t * filelogger_handle;
if ( (filelogger_handle = vfs_sd_open(filename)) == NULL )
{
if ( (filelogger_handle = vfs_sd_create(filename)) == NULL )
{
debug_printf("could not open file");
return 1;
// schlaegt hier fehl
// oder
// bei filename = "1234.txt";
// wird die Datei im Root- und nicht im Unterverzeichnis erzeugt..)
}
}
}


Wenn ich vfs_sd_chdir jedoch gar nicht aufrufe, haut es hin (wenn das
Verzeichnis existiert).

uint8_t filelogger_init (char *filename)
{

// filename = "/xyz/1234.txt";
struct vfs_file_handle_sd_t * filelogger_handle;
if ( (filelogger_handle = vfs_sd_open(filename)) == NULL )
{
if ( (filelogger_handle = vfs_sd_create(filename)) == NULL )
{
debug_printf("could not open file");
return 1;
}
}
return 0;
}


Kann mir jemand auf die Sprünge helfen?
Was macht vfs_sd_chdir()?
Deren Rückgabewert vom Typ struct fat_dir_struct * kann ich auch nirgendwo
weiterverwenden.
Selbst ein verzweifeltes
vfs_sd_rootnode = vfs_sd_chdir()
hat mich nicht weitergebracht.

Über Tips wäre ich dankbar!

Viele Grüße
Meinhard
e***@users.sourceforge.net
2015-06-26 16:52:42 UTC
Permalink
Hallo Meinhard,
Post by Meinhard Ritscher
Was genau macht die Funktion hardware/storage/vfs_sd.c -> vfs_sd_chdir() ?
Sie liefert einen Handle auf das Verzeichnis dirname.
Post by Meinhard Ritscher
Wenn ich versuche, eine Datei in einem Unterverzeichnis anzulegen, geht es auf
[...]
Post by Meinhard Ritscher
// wird die Datei im Root- und nicht im Unterverzeichnis erzeugt..)
Du möchtest also eine Datei in einem Unterverzeichnis schreiben.
Post by Meinhard Ritscher
Wenn ich vfs_sd_chdir jedoch gar nicht aufrufe, haut es hin (wenn das
Verzeichnis existiert).
[...]
Post by Meinhard Ritscher
Kann mir jemand auf die Sprünge helfen?
vfs_sd_open (intern vfs_sd_create_open) öffnet die Datei name. Falls
der Name einen Pfad beinhaltet, wird zuvor in diesen mit vfs_sd_chdir()
gewechselt.
Post by Meinhard Ritscher
Was macht vfs_sd_chdir()?
Sie liefert einen Handle auf das Verzeichnis dirname.
Post by Meinhard Ritscher
Deren Rückgabewert vom Typ struct fat_dir_struct * kann ich auch nirgendwo
weiterverwenden.
Doch, für vfs_sd_open_in().
Post by Meinhard Ritscher
Über Tips wäre ich dankbar!
Dein Denkfehler ist, dass du eine konkrete Implementierung von VFS benutzt
und nicht das generische VFS-Interface, wie es in core/vfs/vfs.h definiert ist.
Alle diese Aufrufe erwarten einen absoluten Dateinamen, also mit Pfad.

-eku
Meinhard Ritscher
2015-06-26 20:40:40 UTC
Permalink
Hi Erik,

vielen Dank schon mal fuer die Antwort!

Nach weiteren zwei Stunden Suche heute und tonnenweise zusaetzlicher
Debugstatements habe ich den Fehler gefunden:
Es funktioniert, wenn ich entweder in der Datei sd-reader_config.h den Wert

#define USE_DYNAMIC_MEMORY 1

setze oder in der fat_config.h die statischen Werte erhoehe

#define FAT_FILE_COUNT XX
#define FAT_DIR_COUNT XX

(Die genauen Werte (XX) muss ich noch ermitteln, ich habe sie im Moment
grosszuegig gewaehlt.)

Drauf gekommen bin ich, als ich testweise ein weiteres Mal
vfs_sd_try_open_rootnode()
aufgerufen habe (in welchem ja ein vfs_sd_chdir("/") steckt) und das mit
rc != 0 und einer Fehlermeldung zurueckkam.
Das machte mich stutzig, da es nach einem reset ja funktioniert.

Nur kurz, was ich erreichen will in gekuerztem PseudoCode.
(ausimplemtiert funktioniert das jetzt mit den obigen
Aenderungen auch so)

fileHandle

logger_init (<dirname>, day, month)
{
vfs_sd_chdir("<dirname>") // existiert das Verzeichnis?
if not success
{
vfs_sd_mkdir_recursive( dirname ) // lege es an, wenn nicht
vfs_sd_rootnode = vfs_sd_chdir("<dirname>")
}
fileName = <day>.log
fileHandle = vfs_sd_open(fileName)
if not success
{
fileHandle = vfs_sd_create(fileName)
}
// weitere Tests mit day, month, modification_date etc
// gekuerzt
}

logger_log(<logText>)
{
vfs_sd_fseek(fileHandle, 0, SEEK_END);
vfs_sd_write(fileHandle, <logText>, len);
sd_raw_sync();
}

logger_close()
{
....
}

Nur kurz zum Hintergrund, was ich damit erreichen will:
Im Prinzip soll es eine Art logrotation werden, mit welcher ich Daten pro Tag
in eine eigene Datei schreibe, welche ich im darauffolgendem Monat wieder
ueberschreibe.
Dazu habe ich
#define FAT_DATETIME_SUPPORT 1
implementiert, aber noch nicht in die Config-Struktur eingebunden.

Damit habe ich immer einen Monat Zeit, die Daten einzusammeln, die Logdateien
wachsen aber nicht unendlich, selbst wenn ich die Daten nicht einsammel.
Das koennte passieren, wenn ich die Daten in eine einzelne Datei (inklusive
Zeit- und Datumsstempel) logge.
Das Ueberschreiben nach 1 Monat ist kein Problem.
Das alles ist bislang nur ein Gedankenexperiment, mir hat es aber keine Ruhe
gelassen, dass ich den Fehler nicht fand.
Post by e***@users.sourceforge.net
Post by Meinhard Ritscher
Deren Rückgabewert vom Typ struct fat_dir_struct * kann ich auch nirgendwo
weiterverwenden.
Doch, für vfs_sd_open_in().
Ja, die ist aber als static deklariert also fuer mich von aussen nicht
sichtbar :(
Post by e***@users.sourceforge.net
Dein Denkfehler ist, dass du eine konkrete Implementierung von VFS benutzt
und nicht das generische VFS-Interface, wie es in core/vfs/vfs.h definiert
Das hatte ich mir noch gar nicht gross angeschaut, da ich explizit auf die SD-
Karte schreiben wollte. Ich werde das mal noch intensiver lesen.
Zwei Fragen vorweg:
Im Moment bin ich ja auf einem Net-IO unterwegs, habe hier aber auch noch ein
etherrape rumliegen. Letzteres hatte ich neben dem aufgeloetetem DataFlash
testweise ein SD-Modul angeschlossen.
Auf Anhieb sehe ich bei dem generischen Interface nicht die Moeglichkeit, in
diesem Setup gezielt auf die SD-Kare zu schreiben.
Ein Unterverzeichnis kann ich damit auch nicht erstellen, oder?

Viele Gruesse
Meinhard
e***@users.sourceforge.net
2015-06-27 13:01:47 UTC
Permalink
Hallo Meinhard,
Post by Meinhard Ritscher
Es funktioniert, wenn ich entweder in der Datei sd-reader_config.h den Wert
#define USE_DYNAMIC_MEMORY 1
setze oder in der fat_config.h die statischen Werte erhoehe
#define FAT_FILE_COUNT XX
#define FAT_DIR_COUNT XX
Die Standardwerte gehen eben davon aus, dass maximal eine Datei und ein
Verzeichnis in Nutzung sind. Persönlich habe ich die für den HTTPD
erhöhen müssen, ansonsten werden nicht alle Dateien der E6-Startseite
von der SD-Karte geladen. USE_DYNAMIC_MEMORY ist praktischer, allerdings
mit einem Mehrverbrauch der dynamischen Speicherverwaltung verbunden.
Hat man ansonsten kein Modul mit dynamischer Speicherverwaltung konfiguriert
schnellt auch noch der Flashverbrauch in die Höhe.
Post by Meinhard Ritscher
logger_log(<logText>)
{
vfs_sd_fseek(fileHandle, 0, SEEK_END);
vfs_sd_write(fileHandle, <logText>, len);
sd_raw_sync();
}
Der Code ist nicht geeignet für die Rotation innerhalb einer Datei.
Post by Meinhard Ritscher
Dazu habe ich
#define FAT_DATETIME_SUPPORT 1
implementiert, aber noch nicht in die Config-Struktur eingebunden.
Könnte man per menuconfig erschließen. Ebenso die Option USE_DYNAMIC_MEMORY.
https://github.com/ethersex/ethersex/pull/417 ist von dir?
Post by Meinhard Ritscher
Post by e***@users.sourceforge.net
Dein Denkfehler ist, dass du eine konkrete Implementierung von VFS benutzt
und nicht das generische VFS-Interface, wie es in core/vfs/vfs.h definiert
Das hatte ich mir noch gar nicht gross angeschaut, da ich explizit auf die SD-
Karte schreiben wollte. Ich werde das mal noch intensiver lesen.
Im Moment bin ich ja auf einem Net-IO unterwegs, habe hier aber auch noch ein
etherrape rumliegen. Letzteres hatte ich neben dem aufgeloetetem DataFlash
testweise ein SD-Modul angeschlossen.
Auf Anhieb sehe ich bei dem generischen Interface nicht die Moeglichkeit, in
diesem Setup gezielt auf die SD-Kare zu schreiben.
Völlig richtig erkannt. Die VFS-Schnittstelle trifft zwei Annahmen:
a) es existiert nur eine konkrete Implementierung
b) die erste Implementierung (VFS-inline) ist schreibgeschützt und die zweite
(SD-Karte) erlaubt das Schreiben

b) ist praktisch bei HTTPD im VFS-inline und Protokolldateien auf der SD-Karte.
Post by Meinhard Ritscher
Ein Unterverzeichnis kann ich damit auch nicht erstellen, oder?
Das geht leider nicht. Ein mkdir-Aufruf ist nicht vorgesehen, obgleich er
in einigen Implementierung vorhanden wäre. Patch/PR willkommen.


-eku
Meinhard Ritscher
2015-06-27 17:57:54 UTC
Permalink
Hallo Erik,
Post by e***@users.sourceforge.net
Die Standardwerte gehen eben davon aus, dass maximal eine Datei und ein
Verzeichnis in Nutzung sind. Persönlich habe ich die für den HTTPD
Ich musste nur erst mal drauf kommen ...
Post by e***@users.sourceforge.net
Der Code ist nicht geeignet für die Rotation innerhalb einer Datei.
Ich werde die komplette Implementierung in einer Branch in meinem Fork auf
github stellen. Vermutlich ist das dann anschaulicher, wie ich mir das
vorstelle. Kann aber noch ein paar Tage dauern.
Danke fuer die Erklaerungen. Das hilft mir weiter, mich da reinzudenken.
Post by e***@users.sourceforge.net
Könnte man per menuconfig erschließen.
Ebenso die Option USE_DYNAMIC_MEMORY.
Ja, hatte ich auch schon ueberlegt.
Post by e***@users.sourceforge.net
https://github.com/ethersex/ethersex/pull/417 ist von dir?
Ja.
Post by e***@users.sourceforge.net
The function get_datetime should reside in their own file.
Das hatte ich mir auch ueberlegt, als ich den commit fertigstellte.
Angesichts der fortgeschrittenen Zeit, habe ich das nur noch als Kommentar
gefragt.
Gibt es einen Namensvorschlag fuer die Datei?
Post by e***@users.sourceforge.net
Das geht leider nicht. Ein mkdir-Aufruf ist nicht vorgesehen, obgleich er
in einigen Implementierung vorhanden wäre. Patch/PR willkommen.
Bei Gelegenheit schaue ich mir das an, verspreche aber nichts.

Zuerst kommt die Nacharbeit zu meinen gestrigen zwei PRs.

Allerdings nicht mehr heute.

Gruss
Meinhard

Loading...