Liberia SdFat

Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat che i sembra moooooooooooooooooooooooooooooooolto più completa di quella standard, ma al contempo un po' più complicata.
La domanda è questa: come posso effettuare inserimenti e disinserimenti della SD a caldo fermo restando i rischi di corrompere il filesystem se estraggo la SD durante la scrittura). Come riesco a capire se la SD è inserita (all'avvio) e se è ancora inserita (dopo averla inserita)?

Inoltre vorrei avere lumi sul funzionamento della libreria perché effettivamente è mooooolto grande e abbastanza complessa.

1°: Montare il volume inizializzando la classe Sd2Card con la funzione Sd2Card::init(xxx)
1bis: Verificare se ci sono stati errori, ad esempio SD non inserita
2: Montare la partizione inizializzando la classe SdVolume con la funzione SdVolume::init(xxx)
3: Navigare nelle directory con la classe SdFile o aprirli/chiuderli rispettivamente con gli fstream

Mi sono perso qualcosa?
Durante i punti 2-3 come riesco a capire se la SD mi è stata estratta?

se non hai una SD inserita non hai una comunicazione SPI valida, quindi te ne accorgi perchè ogni comando va in errore.

io consiglio di provare ad aprire la SD (con la begin/init), scrivere, chiudere. ovviamente se la init ha avuto successo :slight_smile:

E se volessi fare un datalogger dove devo scrivere continuamente?

bufferizzi i dati più possibile in ram.. tanto al massimo se si resetta arduino perdi qualche secondo in più di dati, che al confronto con perdere TUTTI i dati...

magari quando usi la SD accendi pure un led, così sai quando puoi/non puoi estrarre la SD

Janos:
Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat

Quale intendi? Questa?
https://code.google.com/p/sdfatlib/

Si, esatto. Dovrebbe essere la "madre" della SD.h di Arduino...

Ogni funzione vedo che restituisce un valore, basta vedere sempre se l'operazione è andata a buon fine oppure no leggendo quel valore.

Non è che esiste una funzione (che magari mi è sfuggita) per testare se la SD è ancora presente?

Non mi pare. Però puoi fare un'operazione semplice sulla SD e vedere se la scheda c'è in base al fatto se ricevi un errore o no. Ad esempio cambiare la dir.

Ok, grazie mille... :wink:

Unendo questo topic con quanto mi hai detto nella domanda del leOS, non riesco a capire il perché questo codice non vada:

#include <pins_arduino.h>
#include <SPI.h>
#include <SdFat.h>
#include <leOS.h>

//Classi per la SD
Sd2Card card;
SdVolume volume;
ifstream file;

//Classe per lo scheduler
leOS scheduler;

#define CS_SD 4

void initSD() {
	card.init(SPI_FULL_SPEED, CS_SD);
	if (!card.errorCode()) scheduler.removeTask(initSD);
}

void printErrorCode() {
	Serial.println(card.errorCode(), HEX);
}

void setup() {
	Serial.begin(57600);
	scheduler.begin();
	scheduler.addTask(printErrorCode, 2000, SCHEDULED);
	scheduler.addTask(initSD, 2000, SCHEDULED_IMMEDIATESTART);
}

void loop() {

}

Fino a che non inserisco la SD non vedo arrivare niente e dopo mi vedo arrivare gli "0", come mi aspetto. Perché prima di inserire la SD non mi vedo arrivare niente?

EDIT: Forse perché anche la Serial.println lavora a interrupt?

Anche la gestione della seriale è basata su interrupt. Però si affida ad un buffer dove vengono messi i byte da essere spediti oppure prelevati quelli già letti. Solitamente, un task del leOS deve compiere un lavoro non oneroso in termini di risorse, altrimenti blocca ogni cosa. L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.

leo72:
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.

Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto... :wink:

EDIT:
Ho visto che non sono includibili insieme... =( Mi dice che ONETIME è già stato definito...

Janos:

leo72:
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.

Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto... :wink:

EDIT:
Ho visto che non sono includibili insieme... =( Mi dice che ONETIME è già stato definito...

Che io sappia molti socket x le sd hanno anche un microswitch che dice se sono inserite o no...

Grazie per la dritta ma non lo trovo... =(

Janos:

leo72:
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.

Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto... :wink:

EDIT:
Ho visto che non sono includibili insieme... =( Mi dice che ONETIME è già stato definito...

Purtroppo no, il looper è stato scritto per sostituire il leOS.
Però col looper puoi fare cose simili a quelle permesse dal leOS, l'unica differenza principale è che col looper non hai più la certezza assoluta dell'esecuzione del task ad intervalli esatti. Ma se si parla di intervalli di centinaia o migliaia di millisecondi (come nel tuo caso) la cosa è irrilevante.

Janos:
Non è che esiste una funzione (che magari mi è sfuggita) per testare se la SD è ancora presente?

Avevo fatto questo un po' di tempo fa, se tu controllassi gli stati di tutti i pin in tempo reale ti accorgeresti che quando estrai la SD alcuni pin che riguardano l'impegno dello shield e della SD cambiano di stato

Ho creato un controllo e un ripristino automatico nel caso venisse rimossa e reinserita la schedina, il tutto funzionava bene, ma ho ritenuto inuitile tale funzione dato che ......."Perchè mai dovresti rimuovere la sd mentre il sistema è in funzione?" XD

Soprattutto se rimuovi la scheda mentre è in lettura non succede nulla la spi si inchioda e va reinizializzata (poco male), ma se la rimuovi mentre è in scrittura la situazione diventa grave, comprometti i settori di inizializzazione e il file system, tutti i dati saranno perduti e va riformattata

L'idea di lesto del led da accendere quando la SD è in uso non è da scartare. Anzi, avverte visivamente l'utente di non rimuovere la scheda pena danni ai propri dati.

Arduino si accorge che hai tolto la scheda immediatamente, ma non si accorge quando la rimetti .... reinserendola non funziona più a meno che ogni n secondi non gli fai fare il controllo e reinizializzare la stessa, vale la pena fargli perdere questo tempo?

pablos:
Arduino si accorge che hai tolto la scheda immediatamente, ma non si accorge quando la rimetti .... reinserendola non funziona più a meno che ogni n secondi non gli fai fare il controllo e reinizializzare la stessa, vale la pena fargli perdere questo tempo?

perchè, arduino ha altro da fare nel frattempo? :grin: