Vom Umgang mit digitalen Werten

MobiFlight verwendet an einigen Stellen binäre und hexadezimale Zahlenformate um z.B. bestimmte Offsets zu lesen und zu schreiben.

Das Tutorial erklärt wie Werte digital im Computer dargestellt werden, welche verschiedenen Zahlenformate es gibt und es hilft, eigene Konfigurationen in MobiFlight anzulegen und besser zu verstehen.

Das Tutorial wurde erstellt von stephanho - Vielen Dank!

Vom Umgang mit digitalen Werten

MobiFlight verwendet an einigen Stellen binäre Zahlen um z.B. bestimmte Offsets zu lesen und zu schreiben. Das Tutorial erklärt, wie Werte digital im Computer dargestellt werden und es hilft, um diese Einstellungen in MobiFlight besser zu verstehen.

Das Tutorial wurde erstellt von stephanho - Vielen Dank!

Zahlensysteme

In unserer heutigen Welt ist das Digitale, egal in welchem Bereich, nicht mehr wegzudenken.

Wie aber soll man jemandem, der von der Digitaltechnik keine oder wenig Kenntnisse hat, diese näherbringen?

Dazu bedarf es erst einmal der Grundlagen, also das Basiswissen, auf dem alles andere aufbaut.

Hierzu zählen zunächst Zahlensysteme, die für das Arbeiten im Bereich Computer einfach notwendig sind, um Verständnis für die Zusammenhänge entwickeln zu können.
Da ist zunächst das Dualzahlensystem, auch Binärzahlensystem, und das Hexadezimalzahlensystem zu nennen. Beide Zahlensysteme werden uns beim Arbeiten mit Mobiflight immer wieder begegnen.

Das Dualzahlensystem oder das Hexadezimalzahlensystem ist mathematisch betrachtet nur ein Zahlensystem wie jedes andere. Das uns bekannteste Zahlensystem ist das Dezimalzahlensystem und besteht aus den Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8 und 9.

Mit diesen uns bekannten Zahlen können wir alle Zahlen schreiben und sogar mit ihnen rechnen.

123 + 456 = 579
157 – 102 = 55
17 x 19 = 323
618 / 103 = 6

Das ist uns allen nicht fremd. Diese Zahlen aus den Dezimalzahlensystem basieren auf der Zahlenbasis 10.

123 kann man auch anders schreiben:

1x102 + 2 x 101 + 3 x 100 =123
100    +    20    + 3         =123

Merken kann man sich dabei, daß jede Zahl n hoch 0 immer 1 ist.
100 ist also immer 1, ebenso wie 20 oder 160 oder oder.

Das Binärzahlensystem / Dualzahlensystem

Wo fängt man nun am Besten an?

Das wäre das Bit.

Das Bit ist die kleinste digitale Einheit, die es gibt. Ein Bit kann nur zwei Werte annehmen, nämlich 0 und 1. Wie ein Glühlampe: „ein“ oder „aus“ – ok, kaputt geht auch, wäre dann aber wieder „aus“ Zwinkernd

Darauf basiert die gesamte Computertechnik?
Genau. Die Digitaltechnik ist so einfach wie genial. Das erkläre ich nun:

Beginnen wir mit den Einheiten.
1 Bit ist die kleinste Einheit. Die nächst größere Einheit ist ein Crumb, das sind 2 Bit (heute kaum noch gebräuchlich).
Es folgt das Nibble, dies sind 2 Crumb oder 4 Bit. Nibble wird auch Halfbyte genannt.
Es folgt das Byte, dies sind 8 Bit oder 4 Crumbs oder 2 Nibbles oder 2 Halfbytes.
2 Byte sind ein Word, also 16 Bit, 4 Byte nennt man Double Word (32 Bit) und 8 Byte nennt man Quadrouple Word = 64 Bit
Ein Word, also ein Datenwort ist die Grundvereinbarungsgröße bei einem Computer. Die Größe dieser Dateneinheit in Bit wird als Wortbreite oder als Busbreite bezeichnet.

Dieser Bus hat im Grunde nichts mit öffentlichen Verkehrsmitteln zu tun, obwohl ein Bus (im digitalen Sinne) durchaus zum Transport von Daten benutzt wird.

Erkennt ihr schon die Zusammenhänge von Bit, Word und Bus?
Soviel erst einmal zu den Begriffen.

Kommen wir wieder zum Dualzahlensystem.

Das Dualzahlensystem wird auch Binärzahlensystem genannt.
Dual kommt vom lateinischen dualis und heißt soviel wie „zwei enthaltend“. Binär leitet sich ebenfalls aus dem Lateinischen „bini“ ab und bedeutet so viel wie „je zwei“ oder „bina“ für „doppelt“ oder „paarweise“.

Im Binärzahlensystem existieren nur die Zahlen 0 und 1.

Wie rechnet man nun im Binärsystem?
Genau wie in jedem anderen Zahlensystem.

Im Dezimalsystem rechnen wir

  510
+ 510
=1010

Die kleine 10 nach der Zahl soll verdeutlichen, daß wir uns im Dezimalzahlensystem bewegen.

5 + 5 ergibt 10 und wir schreiben rechts die 0 und merken uns die 1 für den Überlauf der rechten Zahl. Da links keine weiteren Zahlen addiert werden, schreiben wir dort die gemerkte Zahl hin, also die 1. 1 gefolgt von der 0 lesen wir als 10.

Genauso geht es im Binärsystem. Hier bekommt jede Zahl eine tiefergestellte 2 zugeteilt, um zu verdeutlichen, daß wir mit Zahlen im Binärzahlensystem arbeiten.

   12
+ 12
= 102

Wie man sieht, ohne die Angabe der Zahlenbasis wäre das Ergebnis identisch. Nur liest man das Ergebnis hier nicht als 10 (zehn) sondern als 1-0 (eins – null)

1 + 1 ergibt hier 10, denn 1 + 1 – damit ist bereits ein Überlauf gegeben und wir schreiben uns die 0 rechts auf und merken uns den Überlauf. Da links nichts weiter addiert wird, schreiben wir den Überlauf direkt hin. Also 1 – 0

Oben, bei 5+5 stellt sicher niemand das Ergebnis in Frage. Wie sieht das aber binär aus?

Oben rechnen wir 5 x 100 + 5 x 100 = 5 + 5 = 10 oder 1 x 101

Bei der Addition unserer beiden Einsen tun wir nichts anderes, nur mit einer anderen Zahlenbasis

1 x 20 + 1 x 20 = 1 + 1 = 10 oder 1 x 21 + 0 x 20.

Im dezimalen Ergebnis wären dies 2.

So kann man jede Zahl von einem beliebigen Zahlensystem in ein beliebiges Zahlensystem wandeln. Wie bereits oben gesagt, wir fühlen uns im Dezimalzahlensystem zu Hause. Wer das Prinzip verstanden hat, fühlt sich nach dieser Lektüre in jedem Zahlensystem heimisch Zwinkernd

Ein Beispiel aus der Welt von Mobiflight & Co:

Da wird für Jeehell ein bestimmtes Bit gebraucht, sagen wir mal das 6. von einem beliebigen Offset..
Nun wird aus der Simulation für diesen Offset der Wert 268 ausgelesen. Dieser Wert ist aber dezimal.

OK, mal eben den Windows-Rechner gestartet, auf Programmierer umgeschaltet und im DEZ-Modus die 268 eingegeben, auf BIN-Modus umgeschaltet.

Ergebnis: 100001100

oder der besseren Lesbarkeit in Nibbles dargestellt:

0001 0000 1100

Wie im Dezimalsystem werden normalerweise führende Nullen nicht dargestellt, hier sollen sie zum besseren Verständnis und aus Gründen der besseren Lesbarkeit mit geschrieben werden.

Das gesuchte 6. Bit ist also 0.
Doch Vorsicht ist angesagt. Wir sind gewohnt, daß wir 1, 2, 3, 4… zählen. Nicht so in der Digitaltechnik. Hier wird bei 0 (Null) angefangen. Also: 0, 1, 2, 3, 4 …

Wenn ich also vom 6. Bit spreche, so ist dies die 7. Zahl von rechts!

Dies hat was mit der Wertigkeit zu tun und beschreibt somit die Potenz der Zahlenbasis.

Bit 0 in der Digitaltechnik ist also das Äquivalent zu 20, das 1. Bit zu 21.
Das 6. Bit wäre somit 26 zugehörig. Eine Eselsbrücke, die man sich gut merken kann.
Wieso eigentlich Potenzen?

Grundlage:
1 x 20 = 1
1 x 21 = 2
1 x 22 = 2x2 = 4
1 x 23 = 2x2x2 = 8
1 x 24 = 2x2x2x2 = 16

Schaue ich mir also 4 zusammenhängende Bits an, dann kann dies so aussehen:
0 0 0 0

Binär stellt sich nun die Frage, wie viele unterschiedliche Darstellungsmöglichkeiten hat man mit 4 Bit?

Schauen wir uns das mal an:

0 0 0 02 = 010
0 0 0 1 = 1
0 0 1 0 = 2
0 0 1 1 = 3
0 1 0 0 = 4
0 1 0 1 = 5
0 1 1 0 = 6
0 1 1 1 = 7
1 0 0 0 = 8
1 0 0 1 = 9
1 0 1 0 = 10
1 0 1 1 = 11
1 1 0 0 = 12
1 1 0 1 = 13
1 1 1 0 = 14
1 1 1 1 = 15

Es sind bei 23 also 4 Bits 16 Möglichkeiten einer unterschiedlichen Darstellung möglich.
Man kann auch sagen, 24 (2x2x2x2=16) Möglichkeiten, wobei dezimal die höchste darstellbare Zahl bei diesem Beispiel 24 -1 ist. Habe ich also 8 Bit, so habe ich 28 Darstellungsmöglichkeiten (2x2x2x2x2x2x2x2=256) und die höchste dezimale Zahl
ist 28-1=256-1=255. Dazu später mehr.

Es geht auch anders

Man nehme die 268 aus dem oben genannten Offset und dividiere solange durch 2, bis am Ende die 1 durch 2 dividiert wird.

Das sieht dann so aus:
268 : 2 = 134 Rest 0

134 : 2 = 67 Rest 0
67: 2 = 33 Rest 1
33:2 = 16 Rest 1
16:2 = 8 Rest 0
8:2 = 4 Rest 0
4:2 = 2 Rest 0
2:2 = 1 Rest 0
1:2 = 0 Rest 1

Nun schreibt man die Zahlen nach dem Rest von links nach rechts nebeneinander auf und zwar in der umgekehrten Reihenfolge, wie man die Restwerte erhalten hat.

Der letzte Restwert kommt aus der Rechnung 1:2=0 Rest 1, also unser Ergebnis:

1 0000 1100

Die Zahlen vom Rest somit von unten nach oben umsetzen von links nach rechts.

Das Bit #6 ist also die 3. Null im 2. Nibble oder die 7. Zahl des 1. Bytes.
Bits werden also von rechts nach links abgezählt. Das rechte, also das niederwertigste Bit nennt man auch Least Significant Bit (LSB), das höchstwertige Bit nennt man Most Significant Bit (MSB)

Das geht nun auch rückwärts. Angefangen wird beim MSB

1 x 28 + 0 x 27 + 0 x 26 + 0 x 25 + 0 x 24 + 1 x 23 + 1 x 22 + 0 x 21 + 0 x 20
256      128     64      32       16       8        4       2       1

Ich habe die Wertigkeiten der Bits im Dezimalzahlensystem darunter geschrieben. Nun muß man nur noch die Werte addieren, die binär eine 1 beinhalten:

256 + 8 + 4 = 268

Möchte ich nun das 6. Bit in dem Offset setzen, muß ich zu dem vorhandenen Wert den dezimalen Wert von 26 = 64 dazuaddieren

268 + 64 = 332

Überprüfung, ob das Bit #6 gesetzt ist:
332 : 2 = 166 Rest 0
166 : 2 = 83 Rest 0
83 : 2 = 41 Rest 1
41 : 2 = 20 Rest 1
20 : 2 = 10 Rest 0
10 : 2 = 5 Rest 0
5 : 2 = 2 Rest 1
2 : 2 = 1 Rest 0
1 : 2 = 0 Rest 1

Binär: 1 0100 1100

Bitte sehr, Bit 6 ist gesetzt.

Natürlich geht das auch viel schneller und einfacher mit dem Windows-Rechner. Aber mit dieser Art seid ihr keine Knopfdruckhausierer, sondern ihr wißt auch WARUM die Dinge so sind. Herzlichen Glückwunsch!

Das Hexadezimalsystem

Das nächste Zahlensystem, das bekannt sein sollte, ist das Hexadezimalsystem. Das kommt aus dem Griechischen hexa von sechs und lateinisch decem von zehn. Wer mal den Begriff sedezimal (lateinisch: sechzehn) hört, kann diese Begriffe in einen Topf werfen, denn sie meinen das selbe.

Das Hexadezimalsystem kennt 16 unterschiedliche „Zahlen“. Der Begriff Zahlen ist hier nicht ganz korrekt.

Es beinhaltet die uns bekannten Zahlen von 0 bis 9 und dann noch die Buchstaben A, B, C, D, E und F, also die ersten sechs Buchstaben unseres Alphabetes.

Hexadezimale Zahlen werden wie gehabt mit der Basiszahl 16 geschrieben, also A3CE16

Oder A3CEhex oder als 0xA3CE.

Die letzte Schreibweise ist uns bereits von Mobiflight bekannt und ihr seht, da schließt sich ein Kreis.

Auch hier geht die Umrechnung in andere Zahlensysteme nach dem bekannten Muster:

A = 10, B = 11, C = 13, E = 14 und F = 15

Somit

HEX: 10 x 163 + 3 x 162 + 12 x 161 + 14 x 160
DEZ: 40960    +  768   +    192   + 14    =  41934

Es geht auch binär:

BIN: 1010 0011 1100 1110
(    A    3     C     E   )

ausgerechnet:

1 x215    + 1x213    + 1x29   + 1x28    + 1x27   + 1x26   + 1x23   +1x22     +1x21
2768       8192    +  512   +  256     + 128  +  64    +  8    +  4     + 2      = 41934

Man erkennt hierbei, daß die Zahlen von einem System in ein anderes sehr leicht umgewandelt werden können und die Mathematik trotzdem stimmt ;)

Hier nun eine Gegenüberstellung der bisher vorgestellten Zahlensysteme:
DEZ   BIN   HEX
00    0000  0
01    0001  1
02    0010  2
03    0011  3
04    0100  4
05    0101  5
06    0110  6
07    0111  7
08    1000  8
09    1001  9
10    1010  A
11    1011  B
12    1100  C
13    1101  D
14    1110  E
15    1111  F

Das Hexadezimalsystem ist also ein Zahlensystem zur Basis 16. Die Gegenüberstellung zeigt, daß die Systeme zwar nicht gleich, aber dennoch zueinander kompatibel sind.

Nehmen wir wieder die Zahl 268 von oben und stellen sie gegenüber

268  0001 0000 1100   10C

Daraus wird durch setzen des Bit #6 

332  0001 0100 1100   14C

10C kann man auch ins Dezimalsystem umrechnen:

1 x 162+ 0 x 161+ 12 x 160= 256 + 12 = 268

oder

1 x 162+ 4 x 161+ 12 x 160= 256 + 64 + 12 = 332

Ihr seht, die Mathematik stimmt und man kann jede Zahl von jedem Zahlensystem in ein anderes Zahlensystem umwandeln.

Hat man also viele Bits, bietet es sich an, diese ins Hexadezimalsystem zu wandeln.
Bitte beachten, daß man rechts anfängt und bei der letzten Ziffer mit Nullen auffüllt.

Ein Beispiel:

1001 1111 1011 0011 im Binärsystem wird

9FB3 im Hexadezimalsystem oder

40883 im Dezimalsystem.

Wer mag, kann das gerne mit den obigen Methoden überprüfen.

Datentypen

Beim Arbeiten mit digitalen Zahlen kommt man nicht darum herum, sich auch mit Zahlentypen zu beschäftigen. Dies hängt mit der Programmiersprache C zusammen, wo diese Datentypen vom Programmierer genutzt werden, um den Speicher effizient zu nutzen.

Welche Datentypen gibt es?

4.1 Boolean (Byte)

Die kleinste Einheit Datentyp ist boolean. Dieser Datentyp belegt ein Bit des Speichers. Nachdem, was wir bisher gelernt haben, können Bits nur den Zustand 0 oder 1 annehmen. Die Zustände werden auch TRUE (1) oder FALSE (0) genannt.

4.2 Integer (INT)

Mit Integer sind hier ganze Zahlen genannt, die Werte in dem Bereich von -32767 bis +32768 annehmen können. Dieser Datentyp wird in einem Word gespeichert. Ein Word sind 2 Bytes, also 16 Bit Speicherbedarf.

4.3 Long (LONG)

Dies sind ebenfalls ganze Zahlen, ebenso wie Integer, nur, daß sie einen größeren Bereich abdecken, nämlich von -2,147,483,648 bis 2,147,483,647. Long’s sind Double Word, haben also die doppelte Länge von Integer, also 4 Bytes oder 32 Bit.

4.4 Float (FLOAT)

Hiermit sind Fließkommazahlen gemeint, also Zahlen mit Stellen nach der Dezimal- oder Kommastelle. Der Zahlenbereich geht von -3.4028235E+38 bis 3.4028235E+38, ist ebenfalls ein Double Word und hat 4 Bytes oder 32 Bit Länge.

4.5 Double (DOUBLE)

Wie 4.4, nur doppelte Länge, also 2x Double Word, 8 Bytes oder 64 Bit

4.6 String (STR)

Strings bezeichnen Zeichenketten. Bei Strings wird immer deren Länge in Bytes mit angegeben ( STR[12]).

4.7 Signed/ Unsigned

Mit SIGNED ist gemeint, daß der Datentype mit einem Vorzeichen behaftet ist. Grundsätzlich sind alle bisherigen Datentypen signed, also mit einem Vorzeichen behaftet. Man braucht dies, um auch negative Zahlen darstellen zu können.

Unsigned sind Zahlen ohne Vorzeichen. Normalerweise wird durch das höchstwertige Bit (MSB) das Vorzeichen übergeben. Ist das MSB 1, handelt es sich um eine negative Zahl, ist es 0, ist die Zahl positiv. Unsigned Zahlen haben den Vorteil, daß sie 1 Bit länger sind.
Für (signed) INT-Zahlenwerte bedeutet dies, daß sie nur 15 Bit läng sind zuzüglich des Vorzeichenbits (also von -32767 bis 32768) und (unsigned) INT-Zahlenwerte sind 16 Bit lang und reichen von 0 bis 131071).

Einen Problembereich der Zahlen signed / unsigned kennen wir bereits aus Mobiflight. Es ist der Zahlenwert des rechten einzelnen Mausclicks bei der PMDG: 2.147.483.648
Dieser Zahlenwert liegt exakt 1 über dem maximalen Bereich des signed Long-INT-Bereiches.

Binär geht dieser Bereich bis 0111 1111 1111 1111 1111 1111 1111 1111,
Dies sind 2.147.483.647. Wie man sieht, ist das MSB 0, weshalb die Zahl als positive Zahl angesehen wird. Wird nun 1 hinzugezählt, haben wir

1000 0000 0000 0000 0000 0000 0000 0000

Wird das Vorzeichen negativ und der Rest aller Bits ist 0. Also -0. 0 kann, mathematisch betrachtet, nicht negativ sein, darum wird ein Fehler ausgegeben.

Stellt man nun aber der 2.147.483.648 ein Minus (-) voran, so handelt es sich quasi um die kleinste darstellbare Zahl von -2.147.483.648, so ist das Ergebnis -2.147.483.648, was binär 1000 0000 0000 0000 0000 0000 0000 0000. Diesen Wert kann Mobiflight übernehmen.

Mobiflight überträgt nun diesen Wert an den Sim, der dort aber unsigned ist und somit wird das Vorzeichen von Mobiflight im Simulator ein Wert ohne Vorzeichen und damit wird der einzelne rechte Mausklick erkannt und ausgeführt. Ein kleiner, aber zulässiger, Trick.

Bit-Logik

Noch etwas Nützliches kann man mit diesen Zahlensystemen machen:

Filtern, verändern und maskieren.

Das Maskieren haben viele schon gesehen, die in Mobiflight im ConfigWizard gearbeitet haben. Meist steht hier 0xFF oder 0xFFFF je nach Anzahl der darüber eingestellten Anzahl der Bytes.
Schon sind wir bei logischen Operationen. Logische Operationen sind Bestandteil der boolschen Algebra, einer Sparte der Mathematik.

Die logischen Operatoren hat jeder schon einmal gehört:

UND   (AND)

ODER (OR)

NICHT (NOT)

Zu diesen Operatoren ist nichts weiter als eine tabellarische Aufstellung des Wahrheitswertes einer logischen Aussage erforderlich.

Wahrheitstabelle für eine AND-Verknüpfung:
a   b  A
0   0  0
0   1  0
1   0  0
1   1  1

Das Ergebnis dieser Wahrheitstabelle für das logische AND ist, daß sowohl a und b den Zustand 1 haben müssen, damit am Ausgang A ebenfalls eine 1 steht.

Auf Mobiflight übertragen: Nur wenn Pin1 und Pin2 auf GND sind, bewirkt dies eine Aktion.

Bei einem logischen OR sieht dies ähnlich aus:
a   b  A
0   0  0
1   0  1
0   1  1
1   1  1

Es muß hier also nur Eingang a oder b oder beide 1 sein, damit ein Ereignis ausgelöst wird.

Fehlt noch das NOT, auch Inverter genannt:
a   A
0   1
1   0

So kann man also aus einem AND ein NAND. ein NOT-AND machen und aus einem OR ein NOR oder NOT-OR

Es gibt noch weitere logische Operatoren, aber wer das vertiefen möchte, befasse sich intensiver mit der boolschen Algebra. Für unsere Zwecke soll das hier reichen.

Wieder zum Maskieren von Werten in Mobiflight.

Der Maskierungswert in Mobiflight wird immer mit dem aktuellen Wert der Simulation AND verknüpft. Da Mobiflight defaultmäßig immer mit 0xFF AND verknüpft, sieht dies folgendermaßen aus:

Nehmen wir eine Wert aus dem Offset 0x03FA (COM 1 stby-Frequenz). Der Wert, den der Simulator liefert, ist beispielsweise 2855 für die Frequenz 128,55 MHz.

Definiert ist hier ein Wert Integer mit 2 Byte Länge, also 16 Bit.

2850 ist binär 0000 1011 0010 0010

Hier kommt nun aber eine Besonderheit zum Tragen: Es ist hier der Haken bei BCD-Mode gesetzt.
BCD steht für Binary Coded Decimal.
Damit wird die Binärzahl direkt in eine Dezimalzahl gewandelt.
Der von FSUIPC gelieferte Wert ist definiert als 2 Byte Integer, also 16 Bit Ganzzahl.

Somit wird jede der 4 Ziffern als binäre Zahl jeweils 4 Bits zugeordnet, also die 2 kommt in die Bits 15, 14, 13 und 12, die 8 in die Bits 11, 10, 9 und 8, die 5 in die Bits 7, 6, 5 und 4 und die letzte 5 in die Bits 3, 2, 1 und 0

Binär sieht die Frequenz (1)2855  folgendermaßen aus:

0010 1000 0101 0101

Dies ist in Hexadezimal

2        8       5       5

Fällt etwas auf? Wird ein binärer Wert (der ja auch ein hexadezimaler Wert ist) BCD-codiert, dann entspricht der HEX-Wert exakt dem dezimalen Gegenstück.

Dieser Wert wird mit FFFF  AND verknüpft. FFFF kann man auch binär auflösen, damit es deutlich wird:

1111 1111 1111 1111
F     F     F     F 
0010 1000 0101 0101
1111 1111 1111 1111

Eine AND-Verknüpfung besagt nach der Wahrheitstabelle, daß im Ergebnis nur dann eine 1 herauskommt, wenn beide Eingänge eine 1 liefern.

In diesem Falle ist es einfach, denn der obere Wert wird auch als Ergebnis geliefert.

0010 1000 0101 0101
1111 1111 1111 1111
0010 1000 0101 0101

Möchte ich nun das letzte Nibble immer auf 0 setzen , muß ich den Maskierungswert verändern:

0010 1000 0101 0101
1111 1111 1111 0000
F       F       F       0
Das Ergebnis wäre
0010 1000 0101 0000
oder
 2    8    5    0

Die letzte Stelle meiner Zahl wäre also bei dieser Maskierung IMMER eine NULL.

Ob diese Aktion sinnvoll wäre, lasse ich mal dahingestellt. Es zeigt aber, welche Möglichkeiten sich ergeben können, wenn man dieses Zahlenspiel beherrscht.

Merke: Ein Wert, der mit F, FF, FFFF maskiert wird, hat im Ergebnis also immer den Eingangswert.

Soll ein Bit in einem Byte gesetzt werden, muß ich wissen, an welcher Stelle das Bit steht.

Hierzu muß man sich von Bit 0 bis 7 nur folgende Werte merken: 1, 2, 4, 8, 16, 32, 64 und 128. Sollen mehrere Bits gleichzeitig gesetzt werden, müssen die Werte der Bits addiert werden.

Ein Beispiel:

Schauen wir uns den Offset 0x0D0C im FSX an (Lights, a switch for each one)

0 = Navigation
1 = Beacon
2 = Landing
3 = Taxi
4 = Strobes
5 = Instruments
6 = Recognition
7 = Wing

Zum Ausschalten aller Lichter wird einfach der Offset auf 0 gesetzt.

Aufbau der Bits zur Maskierung:

W     R     I     S     T     L     B     N
7       6     5    4      3    2     1      0
128   64   32  16    8    4     2      1

Eben hatten wir alle Lichter mit der 0 ausgeschaltet. Damit sind alle Bits auf 0 gesetzt.

Umgekehrt geht das auch, indem alle Bit auf 1 gesetzt werden. Weiter oben hatte ich erklärt, wie man auf die Anzahl der unterschiedlichen Darstellungen kommt.

Wir haben 8 Bits (0 – 7). Somit haben wir 28 – 1 Möglichkeiten, somit 255.

Indem der Offset mit 255 beschrieben wird, gehen alle Lichter an.

Möchte ich beispielsweise wissen, ob das Beacon eingeschaltet ist, muß ich Bit 1 maskieren.

Hierzu wird in der Maskierung statt 0xFF 0x02 eingestellt. Wir erinnern uns: Die Maskierung verknüpft immer UND.

0010 0011 ist beispielsweise der Wert des Offsets. Dezimal sind es 35. Würde ich jetzt mit 0xFF maskieren, würde ich auch nur wieder als Ergebnis 35 erhalten. Daher wird mit 0x02 maskiert. Denn

0010 0011 maskiert mit
0000 0010 ergibt
0000 0010 was dezimal 2 ergibt.

Damit weiß ich, daß das Beacon EINgeschaltet ist.

Wäre mit 0x04 maskiert worden, um das Landelicht zu prüfen, wäre das Ergebnis 0:

0010 0011 maskiert mit
0000 0100 ergibt
0000 0000

Das Landelicht ist somit ausgeschaltet. Um es einzuschalten, müßte man den Offset auslesen und in das Transformfenster $+4 eintragen. Denn würde man einfach nur die 4 in den Offset schreiben, würden alle anderen Lichter ausgehen und nur das Landelicht eingeschaltet. Insofern muß man zu dem vorhandenen Wert 4 addieren.

Das kann man pro Konfigurationszeile also immer nur für jedes Bit einzeln machen. Man braucht somit für diesen Offset 8 Konfigurationen.

Auswerten und beeinflussen von Werten

Mobiflight hat die Möglichkeit, über die Transform-Zeile, Werte zu beeinflussen.

Dies geht mit der Funktion IF(Bedingung, THEN, ELSE)
THEN und ELSE als Worte werden nicht benutzt. Dafür ist die Klammer vorhanden. Der 1. Klammerwert ist die auszuwertende Bedingung. Das Komma trennt davon den THEN-Bereich. Dieser wird ausgeführt, wenn die Bedingung erfüllt ist. Der nächste Bereich nach dem 2. Komma beinhaltet den ELSE-Bereich. Dieser wird ausgeführt, wenn die Bedinung nicht erfüllt ist und somit THEN nicht ausgeführt wird. Optional kann der ELSE-Bereich leer bleiben. Es bietet sich aber an, hier $ einzutragen.

Beispiel:

IF($>359,0,$)

Diese Zeile liest sich wie folgt:
Wenn (der Sim-Wert größer ist als 359, dann gib 0 aus, sonst den Sim-Wert)

Die IF-Bedingungen darf man auch schachteln. Um bei der Kompaßfunktion zu bleiben, soll nun noch überprüft werden, ob der Wert kleiner als 0 wird.

IF($>359,0,IF($<0,359,$))

Das erste IF prüft nun, ob der Sim-Wert größer ist als 359, ist dies so, soll 0 ausgegeben werden. Ist dies aber nicht so, kommt im ELSE-Bereich eine neue IF-Bedingung, die prüft, ob der Sim-Wert kleiner als 0 ist. Ist der Wert kleiner als 0, dann soll 359 angezeigt werden. ELSE wird also ausgeführt, wenn der Wert nicht größer als 359 ist. Faktisch steht hier aber wiederum eine IF-Bedingung.

Angenommen, der Sim-Wert ist 255, dann trifft weder die 1. noch die 2. IF-Bedingung zu, denn der Wert ist nicht größer als 359 und nicht kleiner als 0. Somit bleibt nur die 2. ELSE-Bedingung und es wird der Sim-Wert ausgegeben. Wichtig ist hierbei die Klammerung!

Rechenvorschriften in Mobiflight

Mobiflight verwendet für das Abarbeiten von Vorbedingungen Transformvorschriften.
Dies sind

+ - PLUS – das kennt jeder 1+1=2- 
- MINUS – 6-4=2
* - MAL – Multiplikation – 4*6=24
/ - GETEILT – Division – 12/3=4
> -GRÖSSER ALS – 6 ist größer als 5, 6>5
< - KLEINER ALS – 1 ist kleiner als 7, 1<7
>= - GRÖSSER GLEICH - x>=5, x ist größer oder gleich 5
<= - KLEINER GLEICH – x<=5, x ist kleiner oder gleich 5
!= - NICHT GLEICH – x!=5, x ist nicht gleich 5
% = MODULO-Rechnung - $% 500 – 1000% 500=0, 999% 500=499

Weiterhin kann man Berechnungen mit Klammern beeinflussen. Hierbei gilt der mathematische Grundsatz: Was in der Klammer steht, wird zuerst gerechnet.

9+4*3 ist mathematisch korrekt 21 – hier gilt: Punkt- vor Strichrechnung (erinnert ihr euch?)

(9+4)*3 ist ebenfalls mathematisch korrekt 39 – hier gilt: was in der Klammer steht, wird zuerst gerechnet. Somit bei eigenen Formeln aufpassen!

Schlußwort

Ihr habt jetzt etwas über Zahlensysteme, Datenformate und Wertebeeinflussung und Rechenvorschriften erfahren. Das bezieht sich nicht nur auf Mobiflight.

Im Internet gibt es reichlich Informationen für diejenigen, die noch tiefer in die Materie einsteigen möchten.

Ich hoffe, eine Menge Fragezeichen beseitigt zu haben und ihr kommt nun noch besser mit Mobiflight klar. Es würde mich freuen.

StephanHo für Mobiflight im April 2019