Re: [ethersex-devel] vfs_sd_chdir

2015-06-27 Diskussionsfäden eku
Hallo Meinhard,

 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.

 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.

 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?

  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.

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.

 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

___
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
http://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel


Re: [ethersex-devel] vfs_sd_chdir

2015-06-27 Diskussionsfäden Meinhard Ritscher
Hallo Erik,

On Saturday 27 June 2015 15:01:47 e...@users.sourceforge.net wrote:
 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 ...

 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.

 Völlig richtig erkannt. Die VFS-Schnittstelle trifft zwei Annahmen:
Danke fuer die Erklaerungen. Das hilft mir weiter, mich da reinzudenken.

 Könnte man per menuconfig erschließen. 
 Ebenso die Option USE_DYNAMIC_MEMORY.
Ja, hatte ich auch schon ueberlegt.

 https://github.com/ethersex/ethersex/pull/417 ist von dir?
Ja. 
Gleich hier die Frage: 
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?

 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

___
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
http://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel


Re: [ethersex-devel] vfs_sd_chdir

2015-06-26 Diskussionsfäden eku
Hallo Meinhard,

 Was genau macht die Funktion hardware/storage/vfs_sd.c - vfs_sd_chdir()  ?

Sie liefert einen Handle auf das Verzeichnis dirname.

 Wenn ich versuche, eine Datei in einem Unterverzeichnis anzulegen, geht es 
 auf 
 diese Weise schief:
[...]
   // wird die Datei im Root- und nicht im Unterverzeichnis erzeugt..)

Du möchtest also eine Datei in einem Unterverzeichnis schreiben.

 Wenn ich vfs_sd_chdir jedoch gar nicht aufrufe, haut es hin (wenn das 
 Verzeichnis existiert).
[...]
 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.

 Was macht  vfs_sd_chdir()?

Sie liefert einen Handle auf das Verzeichnis dirname.

 Deren Rückgabewert vom Typ struct fat_dir_struct * kann ich auch nirgendwo 
 weiterverwenden.

Doch, für vfs_sd_open_in().

 Ü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

___
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
http://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel


Re: [ethersex-devel] vfs_sd_chdir

2015-06-26 Diskussionsfäden Meinhard Ritscher
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.

On Friday 26 June 2015 18:52:42 e...@users.sourceforge.net wrote:
  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 :(

 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

___
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
http://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel


[ethersex-devel] vfs_sd_chdir

2015-06-25 Diskussionsfäden Meinhard Ritscher
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


___
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
http://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel