Also das ist der sketch. Ich sitze gerade in der Firma und musste ihn jetzt "nachschreiben" (ist also ungetestet, e.v. Tippfehler).
Bin für jede(!) verbesserung/Vereinfachung offen UND DANKBAR!!!!
Ich will eben meine Alarmanlage/Automatisation eben nicht immer neu starten müssen, wenn ich die "conifg" (Zeitschaltungen, Sensoren,etc.) ändere.
#include <EEPROM.h>
#include <EEPROMAnything.h>
const int EEPROM_START = 32;
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;
// --------------------------------------
// alarm state definitions
// --------------------------------------
const byte arm = 1;
const byte disarm = 2;
const byte alert = 3;
const byte transmit = 4;
const byte timed = 5;
unsigned long id = 123456; // decimal RC code
String name = "KARL"; // readable name
byte level = 1; // 0=always on, 1=nightmode, 2=full armed
unsigned long lasttime = 2;
boolean hastriggered = true;
byte action = 0;
unsigned int timedelay = 100;
a_sensor *root;
void SaveSetup()
{
long unsigned int pos = EEPROM_START;
a_sensor *tmp = root;
do
{
EEPROM_writeAnything(pos, tmp->id);
pos += sizeof(tmp->id);
int l = tmp->name.length();
for(int i=0; i<=l && i<60; i++)
{
EEPROM_writeAnything(pos+i, tmp->name[i]);
// ich denke, hier sollte ich irgendwie auf "\0" prüfen und ggf. früher aussteigen?
}
char endc = '\0';
EEPROM_writeAnything(pos+l, endc);
pos += l + sizeof(endc); //sizeof(tmp->name);
EEPROM_writeAnything(pos, tmp->level);
pos += sizeof(tmp->level);
EEPROM_writeAnything(pos, tmp->action);
pos += sizeof(tmp->action);
EEPROM_writeAnything(pos, tmp->timedelay);
pos += sizeof(tmp->timedelay);
byte n = 0;
if(tmp->nextsensor != NULL) {
n = 1;
}
EEPROM_writeAnything(pos, n);
pos += sizeof(n);
tmp = tmp->nextsensor;
} while (tmp != NULL);
}
void LoadSetup()
{
byte n = 1;
long unsigned int pos = EEPROM_START;
root = NULL;
do
{
char buffer[60];
int i = 0;
name = "";
EEPROM_readAnything(pos, id);
pos += sizeof(id);
for (i=0 ;i<60; i++)
{
EEPROM_readAnything(pos+i,buffer[i]);
name += buffer[i];
if (buffer[i] == '\0')
{
break;
}
}
pos += i+1;
EEPROM_readAnything(pos, level);
pos += sizeof(level);
EEPROM_readAnything(pos, action);
pos += sizeof(action);
EEPROM_readAnything(pos, timedelay);
pos += sizeof(timedelay);
EEPROM_readAnything(pos, n);
pos += sizeof(n);
addSensor(id,name,level,action,timedelay);
} while(n == 1);
}
void InitialiseSettings() {
// Sensors
addSensor(11111,"ALARMANLAGE EIN(KeyA)",1,arm,1);
addSensor(22222,"ALARMANLAGE AUS(KeyB)",1,disarm,1);
addSensor(33333,"NACHTMODUS (D-ON)",2,arm,1);
addSensor(44444,"NACHTMODUS (D-OFF)",2,disarm,1);
// add Timers, either ID or name of the event to trigger; the switching-time goes into the delaytime!
addSensor(55555,"LEDs-ON",0,timed,865); // 990 = 16*30+30 == 16:30
addSensor(66666,"LEDs-OFF",0,timed,866); // 1320 = 22*30 == 22:00
}
//---------------------------------------------------------------------------------------------
// add a new sensor to list
// ---------------------------------------------------------------------------------------------
void addSensor(unsigned long id, String name, byte level, byte action, unsigned int timedelay) {
a_sensor *s = new a_sensor;
a_sensor *p = root;
s->id = id;
s->name = name;
s->level = level;
s->lasttime = 0;
s->hastriggered = false;
s->action = action;
s->timedelay = timedelay;
s->nextsensor = NULL; // end of list;
if(root == NULL) // list is empty
{
root = s; // put this sensor on top of list so it is the first
} else { // there are already at least one other snesor in the list, so append
while (p->nextsensor != NULL) // search for the end of the list
p = p->nextsensor;
p->nextsensor = s;
}
}
void emptylist()
{
a_sensor *p = root;
while (root != NULL)
{
//fahre ans Ende der liste
while (p != NULL)
{
p = p->nextsensor;
}
// lösche den letzen der liste
free(p);
// springe wieder an den anfang der liste
p = root;
}
}
int freeRam()
{
extern int __heap_start, *__brkval;
int v;
return(int) & v - ( __brkval == 0 ? (int) & __heap_start : (int) __brkval);
}
void setup()
{
Serial.begin(9600);
// zeige freien speicher zu beginn
Serial.println(freeRam());
// erzeuge eine snesorliste aus "bsetehenden" werten
InitialiseSettings();
// zeige freien speicher mit sensorliste
Serial.println(freeRam());
// speichere die aktuelle sensorliste ins eeprom
SaveSetup();
// lösche die liste
emptylist();
//zeige freien Speicher nach dem leeren der liste
Serial.println(freeRam());
// lade die sensorliste aus dem eeprom
LoadSetup();
//zeige freien speicher nach dem laden der liste
Serial.println(freeRam());
}
void loop()
{
}
Vielen Dank übrigens für all eure Mühen! Ihr seid echt spitze!!!!!!! DANKE!!!