Montag, 16. April 2012

Der Einstieg in Lua

Einstieg in Lua

Voraussetzung: "Einsteigerkurs“

Der Urwigo builder ist ein recht nettes Tool, aber eines Tages entstehen durch immer neue „dümmere“ Ideen Anforderungen, die man mit einem reinen Kicki-Bunti-Baustein-Geschubse nicht mehr abbilden kann.
Spätestens jetzt wird es Zeit die reine Baustein-Lösung zu verlassen und seinen Horizont Richtung Programmierung zu lenken. Das soll nicht heißen, dass wir auf Urwigo und die graphischen Bausteine ganz verzichten. Nein, wir erweitern unser Projekt lediglich um neue Funktionen. (Wobei ich aus eigener Erfahrung sagen kann, je mehr man lua kennt, desto weniger klickt man die Bausteine zusammen. Aber das kommt von selbst nach und nach und muss nicht auf einen Schlag passieren).

Was ist lua?

Lua ist eine Scriptsprache, die sich dadurch auszeichnet, dass sie wenig Hardware und Speicher benötigt um einfache Abläufe zu realisieren. Klingt also ideal für „Steinzeitgeräte“ wie dem Garmin Oregon (Sorry, aber was Prozessorleistung betrifft, merkt man schon dass das Gerät einige Jahre auf dem Markt ist).
Wenn man sich den Urwigo builder genauer anschaut und eine erstellte gwz Datei entpackt (WinZip, WinRar oder 7zip) so erkennt man, dass die gesamte Programmierung in einer _cartridge.lua Datei steckt, die Urwigo aus den Bausteinen baut. Beim Erlernen der verschiedenen lua Befehl kann es hilfreich sein, einen Baustein ins Projekt einzufügen, das Projekt als gwz abzuspeichern, zu entpacken und sich dann den resultierenden lua Code anzuschauen.


Abb. 1: Gerade mal drei Tabellen bilden das Datenmodell der Straßen: Name, Anzahl der Häuser und Miete pro Haus.
Die Funktion calcRent() berechnet daraus die fällige Miete

Aufgabenstellung für unseren Wherigo

Als Beispiel für dieses Tutorial möchte ich einen Teil aus dem Cachopoly Projekt erläutern. Es gibt Straßen, auf die Häuser gebaut werden können und wo abhängig von der Straße pro Haus Miete fällig wird. (der Einfachheit halber gilt Miete = Anzahl Häuser * Miete pro Haus).

Als erstes definieren ein Zahlvariable namens „RentToPay“.
Danach legen wir je ein Feld (Array) an für den Namen der Straße, die Anzahl der Häuser, die es pro Straße gibt sowie für die Miete, die auf der Straße pro Haus fällig wird. (siehe Zeile 1 bis 3 in Abb. 1). Arrays werden mit geschweiften Klammern angegeben. Pro Straße gibt es einen Wert in dem Array, wobei es auf die Position im Array, Index genannt, ankommt.
Straße 1 (! Badstrasse, da keine Umlaute) hat folglich 1 Haus und pro Haus sind 200 Eur fällig.

Nun definieren wir eine Funktion, die für eine Straße -dargestellt durch den Index- die Anzahl der Häuser mit der Miete pro Haus multipliziert und das Ergebnis der Variablen „objRentToPay“ zuordnet. Der Zugriff auf das Array erfolgt über den Index, den man in eckigen Klammern hinter den Arraynamen schreibt. rentPerHouse[3] liefert das dritte Element des Arrays, nämlich 500.

„objRentToPay“ oder „RentToPay“ ?

Wenn wir uns den rechten Teil von Abb. 1 genauer anschauen, sehen wir, dass bei der Variablen „RentToPay“ ein Feld Identifier vorhanden ist. Dies ist quasi die Id der Variablen in lua. Trägt man hier nichts ein und lässt das Feld auf „Automatic“ so bilden lua die Id indem es „obj“ vor den Namen schreibt. Aus dem Namen „RentToPay“ wird die Id„objRentToPay“. Möchte man dies nicht, so kann man den Identifier selbst vergeben, z.B indem man den Namen „RentToPay“ nochmals ins Feld Identifier schreibt.

Abb2. : Im Flussdiagramm kann lua code mit den Bausteinen "Lua User code" und "Lua user expression" eingebaut werden

Die eigene Funktion aufrufen

Unsere (vereinfachten) Straßen sind durch die drei Arrays definiert und die Funktion für die Mietberechnung ist auch aufgestellt. Wie aber können wir diese Funktion auch nutzen?
Die Lösung zeigt uns Abb. 2. Beim Start des Cartridge verwenden wir einen „Lua User code“ Baustein um die Funktion mit der zweiten Straße aufzurufen. Die Variable „RentToPay“ besitzt nach dem Aufruf den Wert. 3 * 300 = 900. In der anschließenden MessageBox wird diese Variable nun für die Ausgabe mit anderen Textbausteinen konkateniert.
Interessant hierbei ist auch der Baustein „Lua user expression“, der einen direkte Zugriff auf unser streetNames Array ermöglicht und eine Zeichenkette zurückliefert. Im Gegensatz zu „Lua User code“ wird hier also etwas zurückgegeben.
Die Ausgabe im Gerät würde für diesen Fall lauten: „Du erreichst die Strasse E-Werk. Zahle 900 EUR“.

Geben und Nehmen

Apropos Rückgabe, in der zweiten MessageBox wird die Funktion „buildPaymentMessage“ aufgerufen, die dem „Lua user expression“ Baustein einen Wert (Zahl oder Zeichenkette zurückliefern muss. Dazu habe ich den lua Code in Abb. 3 um die Funktion „ buildPaymentMessage“ erweitert, der die gleichen Textelemente zusammenbaut wie unser Concatenate Baustein in Abb. 2. Auffällig ist, dass Zeichenketten -genannt Strings- nicht wie in anderen Programmiersprachen mit + sondern mit .. verbunden werden. Wie man sieht, ist der Zugriff auf das Array streetNames schneller als im Concatenate Baustein. Nachdem der String zusammenbaut ist, wird er durch den return Befehl dahin zurückgegeben wo die Funktion aufgerufen wird. Auch die Funktion „calcRent“ wurde um einen return erweitert, damit wir sie beim Zusammenbauen der PaymentMessage verwenden können.

Abb3. : Während auf der linken Seite buildPaymentMessage ein Beispiel die Konkatenation eines Strings sowie der Rückgabe eines Wertes dargestellt ist, zeigt der rechte Teil, wie man die Id eines lua Objektes anpassen kann.
Das urwigo Projekt zu diesem Tutorial als Download"

Keine Kommentare:

Kommentar veröffentlichen