20160310
crée une mémoire circulaire dans une eeprom
à varier selon EEPROM interne ou
At24Cxx (par exemple de
TinyRtcV1)
ici code pour l'EEPRIOM interne utilisant la class EEPROM
// -------------------------------------
// class RING
#undef DEBUG
#define DEBUG
class RING {
public:
long begin(long adstart,long space){
base=adstart;
long sp=space;
if (sp<=0) sp=EEPROM.length()-base;
last=base+sp;
// search for lanterne rouge
pointeur=-1;
for (long ii=base;(pointeur==-1) && (ii<last);ii=ii+1) {
if (EEPROM.read(ii)==255) pointeur=ii;
}
if (pointeur>=0) { // found flag
#ifdef DEBUG
Serial.print("flag found at ");
Serial.println(pointeur);
#endif
if (EEPROM.read(next(pointeur))==255) {
#ifdef DEBUG
Serial.print("double flag found at ");
Serial.print(pointeur);
Serial.print(" et ");
Serial.println(next(pointeur));
#endif
turned=false;
oldest=base;
youngest=pointeur;
}else {
#ifdef DEBUG
Serial.print("single flag found at ");
Serial.println(pointeur);
#endif
oldest=next(pointeur);
youngest=pointeur;
turned=true;
}
}
#ifdef DEBUG
Serial.print("oldest set:");
Serial.print(oldest);
Serial.print(" youngest set:");
Serial.println(youngest);
#endif
// if not found raz!
if (pointeur==-1) raz();
oldest=pointeur ; //
#ifdef DEBUG
Serial.print("flag at: ");
Serial.println(pointeur);
#endif
return last;
} // begin
long stock(){
if (turned) {
return length()-1;
} else
return youngest-base;
}
void raz(){
for (int i=base;i<base+length();i=i+1) {
if (EEPROM.read(i)!=255) EEPROM.write(i,255);
}
pointeur=base;
} // raz
long length(){
return last-base;
} //length
void store(byte value){
byte v=value;
if (v>254) v=254;
// of course (pointer)=255
EEPROM.write(pointeur,v);
pointeur=next(pointeur);
if (EEPROM.read(pointeur)!=255) EEPROM.write(pointeur,255);
} //store
long available(){
// non rolling space available
return length()-stock();
} //available
long next(long ad){
if (ad >= last) return base;
return ad+1;
} // next
long old() {
return oldest;
}
long young() {
return youngest;
}
private:
long base; //first ring memory(0 or more)
long last; // upper ring memory
long pointeur; // last ring memory used (EEPRIOM.read(pointeur) cntains 255)
bool turned;
long youngest;
long oldest;
};
#undef DEBUG
// --------------- RING Bottom