CRON-Dienst
Der Cron daemon verwaltet so genannte cron jobs. Diese Regeln definieren bestimmte immer wiederkehrende oder einmalige Zeitpunkte zu denen dann Kommandos ausgeführt werden können.
Cronjobs sind auf zweifache Weise in Ethersex implementiert. Eine statische Liste, die zur Compilierzeit bestimmt werden muss und danach auch nicht mehr beeinflusst werden kann und einen dynamischen Ansatz, bei dem die Jobs beim Start von Ethersex in den Ram geladen werden. Danach können nach belieben Jobs entfernt und hinzugefügt werden.
Inhaltsverzeichnis
Voraussetungen
Beide Ansätze haben gemeinsam, dass du erst einmal eine Funktion definieren musst, welche vom Cron daemon zum bestimmten Zeitpunkt aufgerufen werden kann. Die Funktionssignatur sieht allerdings abhängig davon welche Implementierung du wählst, leicht anders aus.
Menuconfig
Das Modul benötigt allerdings die aktuelle Zeit um richtig funktionieren zu können. Du musst daher im selben Untermenü mindestens eine Zeitquelle ebenfalls einschalten. Um Crontabs in ethersex zu aktivieren, wählt man im Menü
│ │ Load a Default Configuration ---> │ │ ... │ │ Applications ---> │ │ ... │ │ [*] System clock support ---> │ │ [*] Cron daemon │ │ [ ] Cron daemon (static jobs)
Statischer Cron Daemon
Die Funktion, welche der Daemon aufrufen soll, muss folgende Signatur haben void func(void) und muss direkt in cron_static/cron_static.c definiert werden.
Füge nun eine Regel in die Struktur cron_static_event_t ein.
Dynamischer Cron Daemon
Auslesen per ecmd
Einfach den ecmd Befehl cron_list zum Beispiel in deinem Browser ausführen. Dann werden dir die Anzahl der aktuellen Cronjobs angezeigt. Jetzt kannst du cron_list N eingeben, wobei du N durch eine Zahl zwischen 0 und Anzahl der Jobs-1 ersetzen solltest. Nun werden dir alle Details zu diesem Job angezeigt.
Entfernen per ecmd
cron_rm N entfernt den Nten Job (fängt bei 0 an zu zählen) aus der cron Liste. Vorsicht! cron_rm ohne Parameter entfernt ALLE cron jobs, und das ohne vorher nachzufragen!
Hinzufügen per ecmd
Jedes Modul muss dafür einen eigenen Befehl implementieren. Stella hat dafür beispielsweise stella cron.
Von deinem Modul aus aufrufen
Die Funktion, welche der Daemon aufrufen soll, muss folgende Signatur haben void func(char* data) und sollte nicht in der cron/cron.c Datei definiert werden, sondern in dem jeweiligen Modul, welche die Cron Funktionalität nutzen will.
Binde in dein Modul die Datei 'cron/cron.h' ein.
Nutze den Befehl cron_jobadd in der Initalisierungsfunktion deines Moduls um beim Start von ethersex cronjobs hinzuzufügen. Folgende Paramater musst du angeben:
- Die Zielfunktion mit der oben genannten Signatur
- Modul ID (dein Modul Zeichen. Wird weiter unten erläutert.)
- Minute, -1 für ignorieren, -2 für jede 2te Minute etc
- Stunde, -1 für ignorieren, -2 für jede 2te Stunde etc
- Tag, -1 für ignorieren, -2 für jeden 2te Tag etc
- Monat, -1 für ignorieren, -2 für jeden 2te Monat etc
- Wochentag, -1 für ignorieren, 0=Sonntag, 1=Montag etc
- Wiederholen, 0=Endlos, 1=einmal etc
- Extra Daten (optional, kann NULL sein)
Extradaten sind eine ziemlich coole Sache. Stella zum Beispiel speichert darin Lichtkanal und Zielwert. Beim Aktivieren des Cronjobs wird der Zeiger auf diese Extradaten dann an die Callback Funktion mit übergeben und stehen direkt zur Verfügung. Bitte beachte hierbei aber, dass der Pointer auf die Extradaten durch einen Malloc Aufruf gewonnen werden muss, sprich die Speicherstelle für die Extradaten müssen vorher auf dem Heap allokiert werden. (Beispiel: char* extra = malloc(2); für 2 Bytes auf dem Heap)
Du musst dich nicht um die Freigabe des allokierten Speichers kümmern. Dies erledigt der Cron daemon bereits.
Modul ID
Damit Cronjobs von verschiedenen Modulen auseinander gehalten werden können, hat jeder dynamische Cronjob ein spezielles Byte (AppID), in das eine möglichst im Projekt einzigartige Zahl im Bereich 0-255 eingetragen werden soll. Der ASCII Zeichensatz ist hier ganz nützlich.
Folgende Module haben bereits eine AppID:
- Stella: 'S'