Hi Leute,
ich bräuchte wieder einmal eure Hilfe:
Ich habe meine Config in Form folgender nested Structure vorliegen und müsste diese Speichern/Laden, blicke aber nicht ganz durch.
typedef struct a_sensor{
unsigned long id; // decimal RC code
String name; // readable name
byte level; // 0=always on, 1=nightmode, 2=full armed
unsigned long lasttime;
boolean hastriggered;
byte action;
unsigned int timedelay;
a_sensor* nextsensor;
} a_sensor;
Soweit ich das verstehe, könnte ich a_sensor eepromwriteanything übergeben und den ersten Sensor speichern, doch wie kann ich die ganze Liste schreiben und dann auch wieder lesen?
Normalerweise würde ich nicht darum ersuchen, doch könntet ihr mir das mit einem "beispielcode" zeigen? 
Danke schon mal für eure hilfe
Rekursiv oder iterativ über die Liste gehen und jedes Element einzeln abspeichern. Das letzte Element hat einen NULL-Pointer. Dadurch hast du die Abbruch-Bedingung.
Beim Auslesen musst du dann den Zeiger auf das aktuelle struct in das vorherige Schreiben.
@ Serenifly: Danke für deine rasche Antwort; aber ich muss doch beim schreiben den pointer bei eeprom.write setzen und beim nächsten eintrag der liste diesen dann um sizeof(a_sensor) erhöhen???
d.h. für den ersten eintrag der liste wäre es wie im Beispiel:
for (unsigned int t=0; t<sizeof(storage); t++)
EEPROM.write(CONFIG_START + t, *((char*)&storage + t));
}
und für den nächsten der liste müsste ich dann CONFIG_START um sizeof(a_sensor) erhöhen?? 
Nein. Der Pointer müsste im EEPROM gar nicht gespeichert werden. Der Einfachheit halber kann man da was speichern, aber was da drin steht ist egal.
Nimm z.B. mal den Fall an, dass der Speicher dynamisch erzeugt wird. Dann könnte das struct jedesmal an einer anderen Adresse stehen. Man liest also die Daten aus und trägt den die Adresse ein die das struct bei diesem Programmdurchlauf hat.
Was du beschreibst geht theoretisch vielleicht wenn die structs in einem Array stehen oder direkt hintereinander angelegt werden. Auf sowas würde ich mich nicht verlassen. Das ist viel zu unsicher.
uhhh...sorry, da hab ich mein "verständnis"-problem wohl falsch ausgedrück.
Dass ich den Pointer zum nächsten element der liste selbst nicht spreichern muss bzw beim laden ihn ohnehin nicht benötige ist mir klar. Aber was ich meine ist beim iterativen speichern der einzelnen elemente, wie meine funktion da ausehen muss.
ich muss der eeprom.write funktion doch sagen, auf welchen speicherbereich es mein element im eeprom
ablegen soll; also habe ich gedacht, ich müsste beim zb. zweiten element meiner Liste der eeprom.write funktion dann nicht CONFIG_START + t
als speicherort angeben, sondern CONFIG_START + sizeof(a_sensor)+ t
Sehe ich das richtig.?
Sorry, wenn noobs ihre probleme erklären ist das warscheinlich immer mehr als mühsam für andere.
Muss es nicht , für mehrere Elemente, eher
CONFIG_START + sizeof(a_sensor)*n + t
heissen, und n von 0 bis ... für jeden a_sensor hochgezählt werden?
Evtl. ist auch ein vordefiniertes Array, und bei Bedarf eine "Anzahl" - Variable, günstiger als eine Kette aus next Pointern.
Ah, sorry. Da hatte eher ich was falsch verstanden 
Ja, sicher. Wobei das was michael_x sagst eher korrekt aus sieht.
Eine verkettete Liste scheint mir hier auch etwas Overkill zu sein. Das ist eher dafür gedacht wenn man die Elemente selbst in dynamischem Speicher stehen hat. Wenn die Größe der Liste konstant ist, kann man auch ein vordefiniertes Array nehmen. Oder wenn sich die Größe ab und zu ändert eventuell ein Array in dynamischem Speicher, aber die Elemente direkt hintereinander. Damit ist der Pointer Kram überflüssig.
Danke jungs für eure Hilfe,
ok, dann hab ich das mit dem CONFIG_START + sizeof(a_sensor)*n + t
eh so "ziemlich" verstanden.
Ich nutze die structure um die sensoren, aktoren und timer meiner Alarmanlage/hausautomatisation zu verwalten und hatte anfänglich gedacht, es wäre schneller, durch eine einfach verkettete liste zu werkeln.
So kann ich im betrieb einfach Elemente hinzufügen und löschen...so mein damaliger Ansatz.
Jetzt muss ich es nur mehr zu wege bringen, die werte auch zu speichern und wieder zu laden.
zumal das ganze projekt schon sehr weit fortgeschritten ist und soweit alles funktioniert, möchte ich an dem struct nix mehr ändern. (anders gesagt, bin froh, dass ich so weit gekommen bin ;-), ich komm aus so tollen sprachen wie realbasic genier)