Zugriff auf die SD-Karte über ECMD: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: == Übersicht == * sd create [Dateiname] Erstellt die angegebene Datei. * sd write [Dateiname] [Text] Schreibt den Text in die angegebene Datei.(Datei MUSS existieren) ...) |
K |
||
| Zeile 98: | Zeile 98: | ||
* Wenn der Befehl ungültig ist (z.B. bei Write nur der Dateiname) kann das System abstürzen | * Wenn der Befehl ungültig ist (z.B. bei Write nur der Dateiname) kann das System abstürzen | ||
* Ordentlichen Remove-Befehl | * Ordentlichen Remove-Befehl | ||
| + | |||
| + | [[Category:Ethersex]] | ||
| + | [[Category:Hardware]] | ||
| + | [[Category:SD-Karte]] | ||
Version vom 28. Dezember 2010, 12:58 Uhr
Inhaltsverzeichnis
Übersicht
- sd create [Dateiname] Erstellt die angegebene Datei.
- sd write [Dateiname] [Text] Schreibt den Text in die angegebene Datei.(Datei MUSS existieren)
- sd read [Dateiname] Ließt eine Datei ein und gibt der Text über die serielle Schnittstelle aus. (WICHTIG: Die Variable buffer[] muss auf die benötigte Größe angepasst werden!)
- sd remove [Dateiname] Setzt die Größe der Datei auf 0
Aktivieren der Funktionen
Die Funktionen sind momentan noch nicht in der Standard-Version vorhanden. Sie müssen somit manuell nachgerüstet werden.
Dazu muss man als erstes die Datei "hardware/storage/sd_reader/ecmd.c" öffnen. Über dem Ethersex-Meta-Block fügt man folgenden Code ein:
int16_t
parse_cmd_sd_create (char *cmd, char *output, uint16_t len)
{
if (vfs_sd_rootnode == 0) return ECMD_FINAL(snprintf_P(output, len, PSTR("SD/MMC backend not available.")));
while (*cmd == ' ') cmd ++;
/* Do this to protect the server from crashing when the filename contains a space */
int x=0;
while (cmd[x] != ' ') {
x++;
}
cmd[x] = 0;
vfs_file_handle_sd_t handle = vfs_sd_create (cmd);
vfs_sd_close(handle);
return ECMD_FINAL_OK;
}
int16_t
parse_cmd_sd_write (char *cmd, char *output, uint16_t len)
{
if (vfs_sd_rootnode == 0) return ECMD_FINAL(snprintf_P(output, len, PSTR("SD/MMC backend not available.")));
while (*cmd == ' ') cmd ++;
int x=0;
while (cmd[x] != ' ') {
x++;
}
cmd[x] = 0;
vfs_file_handle_sd_t handle = vfs_sd_open (cmd);
cmd[x] = ' ';
while (*cmd != ' ') cmd ++;
vfs_sd_truncate (handle, strlen(cmd));
vfs_sd_write (handle, cmd,
strlen(cmd));
vfs_sd_close(handle);
return ECMD_FINAL_OK;
}
int16_t
parse_cmd_sd_read (char *cmd, char *output, uint16_t len)
{
if (vfs_sd_rootnode == 0) return ECMD_FINAL(snprintf_P(output, len, PSTR("SD/MMC backend not available.")));
while (*cmd == ' ') cmd ++;
/* Do this to protect the server from crashing when the filename contains a space */
int x=0;
while (cmd[x] != ' ') {
x++;
}
cmd[x] = 0;
vfs_file_handle_sd_t handle = vfs_sd_open (cmd);
char buffer[100]="EMPTY";
int size = vfs_sd_size (handle);
vfs_sd_read (handle, buffer,
size);
printf(buffer); //DEBUG (How can I return a whole string???)
vfs_sd_close(handle);
return buffer;
}
int16_t
parse_cmd_sd_remove (char *cmd, char *output, uint16_t len) //DUMMY
{
if (vfs_sd_rootnode == 0) return ECMD_FINAL(snprintf_P(output, len, PSTR("SD/MMC backend not available.")));
while (*cmd == ' ') cmd ++;
/* Do this to protect the server from crashing when the filename contains a space */
int x=0;
while (cmd[x] != ' ') {
x++;
}
cmd[x] = 0;
vfs_file_handle_sd_t handle = vfs_sd_open (cmd);
vfs_sd_truncate (handle, 0);
vfs_sd_close(handle);
return ECMD_FINAL_OK;
}
Und folgende Zeilen müssen dem Meta-Block hinzugefügt werden:
ecmd_feature(sd_read, "sd read",PATH, Returns the content of the given file.) ecmd_feature(sd_write, "sd write",PATH_TEXT, Write the given data to the specified file.) ecmd_feature(sd_create, "sd create",PATH, Create a new file.) ecmd_feature(sd_remove, "sd remove",PATH, Remove a file.)
Verwenden der Befehle
Die Befehle können über alle ecmd-fähigen Module aufgerufen werden. (Seriell, HTTPD, ...) Nur der Read-Befehl gibt immer über seriell aus.
TODO
- Wenn der Befehl ungültig ist (z.B. bei Write nur der Dateiname) kann das System abstürzen
- Ordentlichen Remove-Befehl