RIC-Beispiel: Voltmeter

 

Ein weiteres praktisches Beispiel für den Einsatz eines RIC-Datei ist die Anzeige für ein Voltmeter (oder auch Amperemeter, wenn die Beschriftung geändert wird. Für die Ausgabe der RIC-Datei wird nur ein Parameter benötigt, der für den Ausschlag des Zeigers benötigt wird. Die Skala im Display ist so gestaltet, dass sie von 0 bis 100 geht - entsprechend kann auch nur ein Wert von 0 bis 100 mitgegeben werden.

 

Aktiv enthält die RIC-Datei nur zwei Elemente, die etwas zeichnen - jedoch werden noch weitere Elemente benötigt, damit die Anzeige komplett dargestellt werden kann:

 

RIC-Element

Realisierung

Parameter

Anmerkung

Hintergrundbild für Display

Sprite

 

Enthält das Bild, welches im nächsten Element ausgegeben wird

Ausgabe Display

CopyBit

 

Gibt das zuvor definierte Bild aus

Umrechnungsfunktion X-Wert

VarMap

 

Basis für die Berechnung des Endpunktes der Linie

Umrechnungsfunktion Y-Wert

VarMap

 

Basis für die Berechnung des Endpunktes der Linie

Zeiger

Line

0 : Wert

Prozentualer Wert für den Ausschlag des Zeigers

 

Wird die RIC-Datei nun aufgerufen, dann wird folgende Grafik auf dem NXT-Bildschirm zu sehen sein:

 

 

Hier nun die notwendigen Schritte, um die RIC-Datei zu erstellen:

 

Schritt

Beschreibung

0

Starten wir nun das Programm nxtRICeditV2 und beginnen mit einer neuen RIC-Datei

 

 

1

Einfügen eines neuen Sprite-Elements, welches die Grafik für das Hintergrundbild enthalten wird. Hierzu einfach einmal auf den Button mit folgendem Icon drücken:

 

 

Danach eine kleine Grafik mit folgendem Bild erstellen:

 

Die Striche für die Skalierung sind nicht willkürlich eingezeichnet, sondern stimmen mit den Stützwerten der folgenden beiden VarMap-Elemente überein!

 

Wichtig ist, dass das Sprite-Element die Sprite-ID 1 bekommt!

 

Die Platzierung der Grafik auf der zur Verfügung stehenden Zeichenfläche ist nicht wichtig, da ohnehin nur die benutzten Punkte später abgespeichert werden. Sollten Fehler bei der Eingabe der Grafik gemacht werden, so können die Punkte einfach dadurch entfernt werden, wenn der benötigte Speicherplatz wieder minimiert wird:

 

 

 

2

Für die Ausgabe des Sprites wird nun ein CopyBits benötigt, welches durch drücken des folgenden Buttons an das Ende der RIC-Liste angefügt wird:

 

 

In diesem Fall kann man es sich einfach machen, da das komplette Sprite ausgegeben werden soll. Darum können die Werte aus dem Sprite übernommen werden, indem man einfach folgenden Button drückt:

 

 

Danach wird das gesamte Sprite ausgewählt und an der relativen Position [ 0,0 ] ausgegeben.

 

 

3

Als nächstes werden zwei VarMap-Elemente an das Ende der RIC-Elemente-Liste angehängt. Hierzu einfach zweimal auf den Button mit folgendem Icon drücken:

 

 

Die VarMap-Elemente werden dazu benutzt, den vorgegebenen Wert von 0 bis 100 in X- und Y-Koordinaten umzurechnen, so dass der Endpunkt des Zeigers bestimmt werden kann. Es ist nicht notwendig, dass man für alle 101 möglichen Positionen die X- und Y-Werte definiert. Es ist vollkommen ausreichend, wenn in 10er-Schritte die Stützwerte definiert werden. Die Positionen dazwischen werden über lineare Interpolation ermittelt.

 

Wichtig ist außerdem, dass die VarMap-Elemente mit 2 und 3 definiert werden, da die ID 1 bereits für das Sprite verwendet wurde. Daher sollten die beiden VarMap-Elemente wie folgt definiert sein:

 

VarMap-ID

2

 

VarMap-ID

3

 

Domain

Range

 

Domain

Range

 

0

6

 

0

17

 

10

9

 

10

21

 

20

13

 

20

25

 

30

18

 

30

28

 

40

23

 

40

29

 

50

29

 

50

30

 

60

35

 

60

29

 

70

40

 

70

28

 

80

45

 

80

25

 

90

49

 

90

21

 

100

52

 

100

17

 

 

Werte größer 100 werden wie der Wert 100 behandelt.

 

Um die Werte schneller in die Domain/Range-Liste des VarMaps eingeben zu können, kann man die 22 Werte einer VarMap-Liste markieren (Domain 0 bis 100 und die dazugehörigen Range-Werte) und in die Zwischenablage kopieren. Im VarMap-Element muss dann nur noch folgender Button gedrückt werden, der sich rechts neben der Domain/Range-Liste befindet:

 

 

 

4

Als letztes RIC-Element wird Line eingefügt. Dieses Element verfügt, im Gegensatz zu den vier anderen RIC-Elementen, über einen dynamischen Teil: Dem Endpunkt für den Zeiger. Dieser Berechnet sich über die beiden zuvor definierten VarMap-Elementen. Das Line-Element wird über folgendes Icon angefügt:

 

 

Die Parameter für das RIC-Element Line müssen wie folgt gesetzt sein:

 

Startpunkt

Endpunkt

 

X-Wert

Y-Wert

X-Wert

Y-Wert

Beschreibung

29

3

V[2:0]

V[3:0]

Zeiger für das Voltmeter

 

Achtung: Der Endpunkt verwendet VarMaps - die Angabe V[2:0] bedeutet, dass VarMap 2 und Parameter 0 für die Berechnung des Wertes zur Laufzeit verwendet wird!

 

Nachdem nun alle notwendigen RIC-Elemente definiert wurden, kann das Ergebnis über folgenden Button betrachtet werden:

 

 

Wenn nun der Parameter 0 verändert wird, so wird das Preview sofort entsprechend aktualisiert. Entsprechend wird auch der Aufruf innerhalb eines Programms erfolgen. Das folgende Code-Fragment zeigt nun, wie das Voltmeter ausgegeben werden kann:

 

 

task main()
{

   int voltmeter[ 1 ];

 

   voltmeter[ 0 ]= 30;    // Pointer should show on value 30

 

   // Draw complete Voltmeter-Display with one call of RIC file!


   GraphicOutEx( 0,0, "Voltmeter.ric" ,voltmeter );


   while( 1 )

      ;
}

 

 

Anmerkung:

Wenn nun nicht nur ein Voltmeter, sondern ein anderes Messinstrument dargestellt werden soll, dann kann die Einblendung der Skala auch parametrisiert werden, indem das Sprite für die Skala neutral erstellt wird und die möglichen Werte für die Anzeige in einem zweiten Sprite hinterlegt werden.

 

Die Grafik in diesem Sprite sollte so wie links abgebildet aussehen. Natürlich können nach oben hin noch beliebig andere Texte/Beschriftungen angebracht werden. Man sollte nur darauf achten, dass diese zentriert hinterlegt sind.

 

Das Sprite hat in unserem Fall die ID 2 - die gleiche ID wie das VarMap, welches nach den CopyBits-Elementen definiert wird. Jedoch macht dieses hier kein Problem, da zum Zeitpunkt der Definition des VarMap mit der ID 2 das Sprite mit der ID 2 nicht mehr benötigt wird ;-)

 

Der Trick besteht nun darin, dass in einem zweiten CopyBits, welches nach der Ausgabe des Anzeigeinstrumentes platziert wird, ein Teil (eine Zeile) aus dieser Liste an eine vorgegebene Position kopiert wird. Die vertikale Position für das Ausschneiden kann nun in einem zweiten Parameter mitgegeben werden ;-)

Ist der zweite Parameter beim Aufruf z.B. 6, dann wird "0 - 1 V" ausgegeben. Bei einem Wer von 12 erscheint die Einblendung "0-100 mA"

 

 

Dieses zusätzliche CopyBits muss nun wie folgt definiert werden:

 

Sprite-ID

Pos X

Pos Y

Width

Height

Rel X

Rel Y

 

2

0

P[1]

28

5

15

12

 

 

Achtung: Gelb markiertes Felde muss als Parameterwert definiert werden!

 

Somit sie die komplette RIC-Elemente-Liste wie folgt aus:

 

 

 

Die Verwendung des zusätzlichen Parameters sieht dann wie folgt aus:

 

 
 

#define Scale_0_100_mV     0
#define Scale_0_1_V        6
#define Scale_0_100_mA    12
#define Scale_0_1_A       18
#define Scale_0_100_kOhm  24
#define Scale_0_1MOhm     30

#define Scale_Sound       36

#define Scale_Light       42

 

task main()
{

   int voltmeter[ 2 ];

 

   voltmeter[ 0 ]= 30;           // Pointer should show on value 30

   voltmeter[ 1 ]= Scale_0_1_A;  // Scale is 0 to 1 A

    

   // Draw complete Voltmeter-Display with one call of RIC file!


   GraphicOutEx( 0,0, "Voltmeter2.ric" ,voltmeter );


   while( 1 )

      ;
}

 

 

 

Ein ausführliches Beispiel, welches die Sensoren für Licht und Sound verwendet, findet sich im Beispielprogramm Voltmeter3.nxc