Hallo Moritz,
MajorMadness":2jiun8i5 schrieb:
Poste doch endlich mal deinen kompletten Quelltext. Dann sieht man wie du es gelöst hast, wovon du redest und andere können sich das rauskopieren wovon du sprichst.
Ich habe dich ja schonmal drum gebeten dein Projekt vor zu stellen. Damit meinte ich nicht du sollst irgendwas pseudohaftes in das Thema eines anderen schreiben
was soll denn der Quelltext bringen, wenn man das dahinterliegende Konzept nicht kennt bzw.
dessen Beschreibung nicht verstanden hat? Man könnte ja auch mal nachfragen.
Das entscheidende ist das Konzept selbst und nicht, wie es umgesetzt wurde. Für eine Umsetzung gäbe es zig Möglichkeiten, meine ist nur eine davon. Die jeweilige Umsetzung ist ja nur noch Detailkram, in dem man sich verlieren wird, wenn man versucht, daran das Konzept zu durchschauen.
Hier ist ein schöner Artikel bzgl.
Superloop vs. Event-Driven.
Kern des ganzen bei mir ist die EventQueue. Die hat die Methoden
- void addListener( EventListener *listener, int mask)
- void addEvent( Event *event)
- void dispatch()
Von der EventQueue (eine Template Class) gibt es eine einzige globale Instanz.
Der Timer erzeugt in seiner ISR TimerEvents und stellt sie per addEvent in die EventQueue.
Der Tastaturtreiber ist einer der EventListener, der sich für TimerEvents interessiert und erzeugt selbst auch Events: KeyEvents.
Anderer Klassen interessieren sich für KeyEvents, leiten also auch von EventListener ab. Und erzeugen u.U. auch wieder Events, z.B. einen LightSettingsEvent aufgrund der Änderung der Lichtzeiten/parameter über das Menü.
Für einen LightSettingsEvent gibt es natürlich auch einen EventListener.
Initialisisert/instantiiert/registriert wird das ganze Klasse für Klasse wie die Abhängigeiten jeweils sind:
- setup() instantiiert die GUI-Klasse
- die instantiiert das LCD, das Menü, den Timer, den LightTimerStorage, den DimmerStorage, das Light, die RTC, den Tastaturtreiber
- die wiederum andere Klassen, die sie benötigen, das Light z.B. den Dimmer, der Dimmer die Dimm-Effekte
- LightTimerStorage und DimmerStorage registrieren Speicherbereiche im globalen Objekt EEProm
- manche von ihnen registrieren sich bei der EventQueue als EventListener
usw.
Die main-Loop macht nichts anderes, als dispatch der EventQueue aufzurufen. Bis auf die Timer-ISR passiert alles andere in den EventListenern.
Die Verarbeitung eines Events wird vollständig abgeschlossen, bevor der nächste Event verarbeitet wird. Das schont den Stack und sorgt für Status- und Datenkonsistenz.
Im Groben funktioniert jede Anwendung so, die dem Event Driven Design folgt. Nur heißen dort die Klassen anders und interagieren anders miteinander weil es eine andere Anwendung ist und/oder der Entwickler ein anderer ist.
Vielleicht beschäftigst Du Dich etwas mehr mit solchen Konzepten. Dann brauchst Du den Code anderer nicht mehr sondern kannst sie selbst umsetzen.
sondern dir wirklich mal die Mühe machen und ein Thema eröffnen wo du deinen Code postest, was warum geschied und wie man damit ne dimmung/steuerung/whatever baut. Mir geht es nicht darum deinen Code zu zerreissen aber wenn du immer meinst meiner ist so schlecht: Zeig doch einfach wie man es richtig macht. :bier:
Ich komme nicht dazu, was vernünftiges auf meine Homepage zu stellen. Und den Quelltext allein werde ich nicht weitergeben.
Grüße, Markus