Da du wenig greifbares lieferst, ist es jetzt schwer, da eine Methodik
vorzuschlagen.
In Ermangelung von Details schlag ich einfach mal vor, die ganze Sache
umzudrehen. Du sagst, du hättest einige Werte die abhängig von
irgendwelchen Zustäden anzuzeigen sind.
Na da würde ich doch glatt vorschlagen, die Werte zusammen mit einer
Beschreibung abzuspeichern, aus der hervorgeht, wann der jeweilige Wert
anzuzeigen ist. Auf Anhieb würde ich da mal vorschlagen, 2 Masken zu
haben: die eine legt fest, welche Zustände vorliegen müssen, damit eine
Anzeige erfolgt. Die andere legt fest, welche Zustände eine Anzeige
verhindern.
Die Zustände selbst sind bitcodiert in einem uint8_t Wert. Der
Einfachheit halber nehme ich jetzt mal an, dass es sich bei dem Wert
immer um einen int16_t handelt. Falls das nicht so sein sollte, könnte
man immer noch über ein Typflag und eine union da mehrere
unterschiedliche Datentypen übereinander legen.
1 | typedef struct displayValue_
|
2 | {
|
3 | int16_t Wert;
|
4 |
|
5 | uint8_t showMask;
|
6 | uint8_t suppressMask;
|
7 | } displayValue_t;
|
8 |
|
9 | #define NO_STATE 0x00
|
10 | #define STATE_1 0x01
|
11 | #define STATE_2 0x02
|
12 | #define STATE_3 0x04
|
13 | #define STATE_4 0x08
|
14 | #define STATE_5 0x10
|
15 |
|
16 | // Die geschwindigkeit wird angezeigt, wenn Zustand 1 oder Zustand 2 vorliegen
|
17 | // aber nicht, wenn gleichzeitig Zustand 4 vorliegt
|
18 | displayValue_t Speed = { 0, STATE_1 | STATE_2, STATE_4 };
|
19 |
|
20 | // Der Öldruck wird angezeigt, wenn Zustand 3 gesetzt ist
|
21 | // und es gibt keinen Ausschlussgrund
|
22 | displayValue_t OilPressure = { 0, STATE_3, NO_STATE );
|
23 |
|
24 | // und hier ist dann noch der aktuell im Programm vorhandene zustand
|
25 | // der durch Benutzereingaben manipuliert wird.
|
26 | uint8_t currentState;
|
man könnte die entsprechenden Variablen auch in einem Array
zusammenfassen, was insbesondere die Anzeigeroutine dann vereinfachen
würde. Aber es wird auch so gehen, indem man sich erst mal eine Funktion
schreibt, die die Bewertung einer derartigen Variablen macht und die
dann für alle Variablen aufruft.
1 | void showRestrictedValue( displayValue_t * dispVal )
|
2 | {
|
3 | if( dispVal->showMask & currentState ) // irgendeiner der geforderten
|
4 | // Zustände reicht für eine Anzeige
|
5 | {
|
6 | if( ( dispVal->suppressMask & currentState ) == 0 ) // aber es darf kein Ausschlussgrund
|
7 | // gegeben sein
|
8 | {
|
9 | .... Voraussetzungen erfüllt. Der Wert kann angezeigt werden
|
10 | }
|
11 | }
|
12 | }
|
13 |
|
14 | void showValues()
|
15 | {
|
16 | showRestrictedValue( &Speed );
|
17 | showRestrictedValue( &OilPressure );
|
18 | }
|
ob du jetzt die Bits in den 'Erlaubt' bzw. 'Verboten' Masken als eine
Und-Verknüpfung ansehen willst (alle Zustände müssen gegeben sein), oder
als eine Oder Verknüpfung (einer der angegebenen Zustände reicht),
bleibt dir überlassen bzw. hängt von den Gegebenheiten ab. Eine
umfangreiche allumfassende Lösung ist hier nicht so trivial zu
implementieren, so dass man sich auf das beschränken wird, was
tatsächlich im konkreten Projekt gebraucht wird. Das Problem ist
nämlich, dass derartige 'Bedingungen' im allgemeinen Fall recht komplex
werden können: Ein Wert wird angezeigt wenn etweder Zustand 1 oder
Zustand 2 vorliegen, aber nicht beide gleichzeitig, oder aber wenn
sowohl Zustand4 als auch Zustand 5 vorliegt, aber wenn nur Zustand 5
alleine vorliegt, dann kommt es zu keiner Anzeige. Da kommt man dann mit
so einer einfachen Masken-Sache nicht mehr weit und man könnte zum
Beispiel anleihen an 'regular Expressions' nehmen, um sich eine
Beschreibungssyntax für den Sachverhalt auszudenken.
Wäre mal ein Vorschlag.