Elias B. schrieb:
> Hast du mir evtl. einen Ausschnitt wie du so etwas löst, oder ein Open
> Source Projekt wo ich mir Anregung holen könnte?
Hat doch Max G. weiter oben schon angesprochen.
Du könntest natürlich einen Haufen globaler Variablen haben, oder die
alle in einer struct sammeln. So wie du das haben möchtest.
Überleg dir ganz einfach, wie du im Programm auf die Werte zugreifen
willst. Was ist für dich in der Benutzung angenehm? Und das
implementierst du dann. Oftmals geh ich auch so vor, dass ich erst mal
das benutzende Programm schreibe (oder zumindest anreisse) um zu sehen,
welche Verwendung der Konfigurationsdaten ich haben werde. Daraus folgt
dann, wie ich die Daten strukturiere. Das Pferd wird also von hinten
aufgezäumt.
Ich erfinde mal was.
Da sei eine Ampel. Diese Ampel soll konfigurierbar sein auf
* Länge der Rotphase (in Sekunden)
* Länge der Gelbphase (in Sekunden)
* Länge der Grünphase (in Sekunden)
* Soll die Ampel Grün-Blinken oder direkt von Grün nach Gelb umschalten?
(In Österreich blinken die Ampeln 5 mal, in Deutschland nicht)
* Soll es eine Nachtschaltung für Gelb-blinkend geben?
Wenn ja, wann fängt sie an und wann hört sie auf?
Das sollen meine Konfigurationswerte sein.
So. Jetzt skizziere ich mein Ampelprogramm ungefär. Ich werde es als
Statemachine implementieren und auf die meisten Konfigurationswerte
möchte ich ganz einfach über eine Funktion zugreifen können. So ungefähr
while( 1 )
switch( state )
case RED:
WaitTime = ConfigRedTime();
nextState = RED_WAIT;
break;
...
daraus ergeben sich Funktionen für den Zugriff: Die Zeiten will ich als
Integer haben und das soll die Zeit in Sekunden direkt sein.
Die Entscheidungswerte ja/nein sind ganz normale Boolsche Variablen mit
der C üblichen Bedeutung: 0 bedeutet Nein, 1 bedeutet Ja
Und die Zeiten, die leg ich als 16 Bit Wert ab. Das reicht mir, weil ich
nicht mehr als Minutenauflösung brauche und ein Tag hat nicht mehr als
24*60 = 1440 Minuten. Die Zeiten krieg ich direkt als Minuten seit
Mitternacht.
Damit hab ich dann auch schon eine Vorstellung darüber, was ich alles an
Konfigurationswerten brauchen werde und auch welche Datentypen ich dafür
benutzen will.
Also mach ich mir eine erste Version einer Ampel-Konfiguration
struct ConfigLights
{
uint8_t redPhase;
uint8_t yellowPhase;
uint8_t greenPhase;
uint8_t doGreenBlink;
uint8_t nightlyYellowBlink;
uint16_t nightlyBlinkStart;
uint16_t nightlyBlinkEnd;
};
und erst dann überleg ich mir, wie jetzt der Datenaustausch mit einem
Frontend-Programm aussehen wird, mit dem dann der freundliche Polizist
(oder wer das dann auch immer macht), die Ampel an einer Kreuzung
konfiguriert. Und der macht das auch nicht, in dem er die Werte direkt
irgendwo kryptisch eingeben muss, sondern der bekommt ein schönes
GUI-Tool, welches ihm die Werte übersichtlich präsentiert und auf
Knopfdruck zur Ampel überträgt.