AntiGuide: ArduinoEepromMemoryRing



PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes 216.73.216.172 :: Signaler un abus :: le: 20250805 20:15:56
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