de:doc:lua_start
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
de:doc:lua_start [2013/10/27 17:47] – created wsauer | de:doc:lua_start [2014/03/29 04:13] – [Die Menu Kommando's] admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Erstelle Deine eigenen OOBD Scripts | + | ====== Erstelle Deine eigenen OOBD Skripte |
+ | Die " | ||
- | The " | ||
+ | ===== Was ist Lua? ===== | ||
- | ===== What is Lua? ===== | + | Einfach gesagt ist [[http:// |
- | Simply said, [[http:// | + | Das ermöglicht es ein Programm zu erstellen und das Verhalten |
+ | Glücklicherweise wurde Lua ziemlich populär in den letzten Jahren und so ist es heute für alle wichtigen Plattformen verfügbar wie z.B. Desktop PC's, Smartphones und normale Mobiltelefone. | ||
- | This allows to make a program now but change its behavior later as needed. This is widely used in the OOBD script engine: The script engine is there from the beginning, but what it does is defined by the script which is loaded at runtime. Another script, another functionality.. | + | Es gibt eine Menge an Dokumentation über Lua im Internet, so das wir das Rad nicht noch mal neu erfinden wollen. Wir werden uns darauf konzentrieren, wie Lua innerhalb von OOBD funktioniert. |
- | Luckely | + | ===== Die Lua - OOBD Schnittstelle ===== |
+ | Wenn Lua innerhalb eines anderen Programms ohne weitere Hilfestellung gestartet wird, reagiert es wie eine Black Box: Es gibt keine Verbindung vom inneren zum äußeren Programm, keinerlei Eingabemöglichkeiten und keine Rückmeldungen an das aufrufende Programm. Das ist offensichtlich nicht besonders sinnvoll. Deshalb müssen, wenn Lua in ein Programm eingebaut wird, einige Schnittstellen erstellt werden, die Lua mit dem Host kommunizieren lassen. | ||
- | There are tons of documentation about Lua available in the internet, so we'll not explain the wheel here once more, we'll just focus on how Lua works inside OOBD. | + | Aus der Sicht von Lua arbeiten diese Schnittstellen als normale Lua Funktionsaufrufe. Aber wenn eine solche Funktion aufgerufen wird, verzweigt die Ausführung des Programms in das äußere Programm, macht dort irgendwas und kehrt letztlich von dieser Funktion zurück zu Lua. |
+ | Im Moment unterstützt OOBD zwei Arten von Schnittstellen für Lua: Einige die Menue' | ||
- | ===== The Lua - OOBD Interface ===== | + | **Wichtig** Um während der Fehlersuche die festeingebauten erweiterten |
- | + | ||
- | If Lua runs inside another program, without further assistance it does it like in a black box: No connection from the inside to the outside, no inputs, no feedbacks. This is obviously not very senseful, so when Lua is implemented into another program, there are normally some interfaces made up to let Lua and its host communicate to each other. | + | |
- | + | ||
- | + | ||
- | From the Lua perspective, | + | |
- | + | ||
- | In the moment the OOBD interface supports two kinds of interfaces for Lua: Some for creating the menus, and some to talk to the serial line (( this is certainly subject to change in the future, when OOBD becomes more generic and the data links become more abstract)) | + | |
- | + | ||
- | + | ||
- | **Important** To allow it during debugging to replace the hardcoded extended | + | |
local serFlush =serFlushCall | local serFlush =serFlushCall | ||
serflush() | serflush() | ||
| | ||
- | + | Mit dieser Benamungskonvention enden die festeingebauten erweiterten Funktionen mit xxx" | |
- | So by naming convention the hardcoded extended functions ends with xxx" | + | |
- | Please keep this in mind while reading this document or writing own code. | + | Bitte behalte das im Gedächtnis, |
+ | Aber bevor wir einen Blick in den Programmablauf werfen, müssen wir verstehen wie der Lua Compiler (Luac) arbeitet und was das für die Programminitialisierung bedeutet: | ||
- | But before we look in detail in the program flow itself, we need to understand how the lua compiler (luac) works and what that means for the program initialization: | + | ==== Kompilierung und Aufstartkode ==== |
- | ==== Compiling and Startup code ==== | + | Um Speicherplatz zu sparen und die Aufstartzeit zu reduzieren, wird der Lua Interpretierer innerhalb OOBD nicht mit dem Quellcode ,der dann erst einmal kompiliert werden muss bevor er ausgeführt werden kann, versorgt. Stattdessen wird der fertig kompilierte Lua Programmkode eingebunden. |
- | To save memory and reduce the startup time, the Lua interpreter inside OOBD is not feed with the Lua programm source code text directly as this would need to be compiled first to be executed, which is time & memory consuming. Instead the compiling is done beforehand and just the compiled Lua program code is than used to be loaded into OOBD. | + | Der Kompilierungsprozess funktioniert folgendermassen: |
- | The compile process works like that, that the Lua compiler (a command line program called luac) translates the source code(s) (with the extension .lua) into a single file (with the extension .lbc) which contains the compiled program. | + | Der Kommandozeileneintrag sieht dann folgendermaßen aus: |
- | The command would be like this: | + | |
- | + | ||
- | | + | |
| | ||
| | ||
- | In the OOBD source code repository there are some samples about how to do this. | + | In dem OOBD Quellkode Sammelverzeichnis sind einige Beispiele abgelegt, die zeigen wie es gemacht wird. |
+ | Wenn Du nun Deinen eigenen Übersetzungsprozess beginnen möchtest, gibt es zwei Dinge die Du wissen musst, da luac ein wenig anders arbeitet als ein gewöhnlicher Kompilierer. | ||
- | If you want to set up your own compile process, there are two things you need to know, as luac works partly different as normal compilers | + | - luac beurteilt **nicht** einige require() oder doFile() statements, sodaß diese Dateien nicht in der Ausgabedatei wiedergefunden werden können. Alle benötigten Dateien müssen stattdessen als Eingabedateien eingebunden werden, um in der Ausgabedatei enthalten zu sein. |
+ | - Auch die Reihenfolge der Eingabedateien ist wichtig: Luac bindet diese Dateien zusammen, in der Reihenfolge in der sie angefügt werden. In dieser Reihenfolge werden sie später auch ausgeführt. Hierbei musst Du darauf achten, das Variablen und Funktionen deklariert werden müssen **bevor** sie das erste Mal benutzt werden. Wenn das nicht passiert, bekommst Du eine Schutzverletzung. | ||
- | - luac does **not** evaluate any require() or doFile() statements, so these files would be missed | + | Wegen des zweiten genannten Punktes, sollte die Lua Funktion die die kompletten Lua Strukturen initialisiert, |
- | - also the sequence of the input files is important: Luac glues the files together in the same sequence as their are given; and in the same sequence the file is executed later. \\ Here you have to take care that variables and functions are been declared before they are used first time, otherways you'll get a " | + | |
- | Because of item 2, the lua function, which sets up the whole lua structures, should be the last and only command in the lasr file given to luac. | + | === Das Start("" |
- | === The Start("" | + | Um der OOBD Anwendung die Möglichkeit zu geben, neu initialisiert zu werden |
- | + | wird der Name einer solchen Initialisierungsfunktion mit **Start("","" | |
- | To give the OOBD application the possibility to reinitialize the system | + | |
- | | + | |
| | ||
- | ==== The Menu commands | + | ==== Die Menu Kommando' |
- | OOBD uses just tree functions to set up the menu structures. Let's have a look into some sample code first: | + | OOBD benutzt nur drei Funktionen um die Menue Strukturen zu realisieren. Deshalb lass uns zuerst einen Blick in einen Beispielkode werfen: |
<code lua> | <code lua> | ||
function Start(oldvalue, | function Start(oldvalue, | ||
identifyOOBDInterface() | identifyOOBDInterface() | ||
- | setSendID(" | + | setSendID(" |
openPage(" | openPage(" | ||
addElement(" | addElement(" | ||
Line 89: | Line 80: | ||
- | ----------------- | + | ----------------- |
Start("","" | Start("","" | ||
Line 96: | Line 87: | ||
- | (BTW: Here you also see the start() | + | (Nebenbei gesagt: Hier siehst Du die start() |
- | So what do we found here? First we have the | + | Also was finden wir hier? Zuerst haben wir den Aufruf der Funktion |
=== openPage(" | === openPage(" | ||
- | This function tells OOBD that a new menu should be made. The //title// is used, what a surprise, as title for that new menu. | + | Diese Funktion teilt OOBD mit, das ein neues Menue erstellt werden soll. Der //Title// wird benutzt, welch Überraschung, für den Namen des Titels dieses neuen Menü' |
- | Then the menu is filled with | + | Dann wird das Menü aufgebaut mit |
=== addElement(Description, | === addElement(Description, | ||
- | This call adds a single element to the list. For now these function has the following parameters | + | Dieser Funktionsaufruf fügt ein einzelnes Element zu der Liste hinzu. Diese Funktion hat die folgenden Parameter |
- | * Description(String): | + | * Description(String): |
- | * function: | + | * function: |
- | * initialValue(String): | + | * initialValue(String): |
- | * Flagset(Integer): | + | * Flagset(Integer): |
- | * id(String): | + | * id(String): |
=== pageDone() === | === pageDone() === | ||
- | The pageDone() | + | Die pageDone() |
- | The final result looks than similar like this (you'll noticed that the script has slightly changed after the screenshot has been made) | + | Das entgültige Ergebnis sieht dann ähnlich wie dieses aus. (Du wirst feststellen, |
{{: | {{: | ||
- | ==== The Menu Function Call ==== | + | ==== Das Menü Funktionsaufruf |
- | As shown above, we've now set up the menu items - but now we want something happen when the user selects a menu item, won't we? | + | Wie oben gezeigt, haben wir nun die Menü Einträge aufgesetzt |
- | So let's assume the user selects an item. What happens now? | + | Lasst uns also annehmen, das ein Benutzer einen Eintrag auswählt. Was passiert jetzt? |
- | - OOBD looks, which Lua function is assigned to that menu item | + | - OOBD schaut nach, welche |
- | - than that Lua function is called, with two parameters: | + | - dann wird diese Lua Funktion mit diesen beiden Parametern aufgerufen: |
- | * the actual displayed value of that item | + | * der aktuell dargestellte Wert dieses Eintrags |
- | * and the id with we gave to that menu item during initialization | + | * und die id, welche wir dem Menüeintrag gaben, während der Initialisierung |
- | - than the called | + | - dann macht die aufgerufene |
- | - when the function is finished, it returns a string value | + | - wenn die Funktion abgearbeitet ist, gibt sie eine Zeichenfolge zurück |
- | - that string value is then displayed as new value of the menu item | + | - Diese Zeichenfolge wird dann als neuer Wert dieses Menüeintrags dargestellt |
- | That's already all, that does the job :-) | + | Das ist erstmal alles, und es erfüllt den Zweck :-) |
- | ==== The Communication | + | ==== Die Kommunikation Kommandos |
- | OOBD uses (actual) serial communication to talk to the diagnostic device. To allow Lua to send and receive data from the serial port, a few extended | + | OOBD benutzt gegenwärtig eine serielle Kommunikation, |
=== serFlush() === | === serFlush() === | ||
- | It just clears the input buffer | + | Diese Funktion leert den Eingabespeicher |
=== serWrite(String) === | === serWrite(String) === | ||
- | Sends // | + | Diese Funktion sendet einen // |
=== serSleep(milliseconds) === | === serSleep(milliseconds) === | ||
- | waits // | + | Wartet |
=== serReadLn(msTimeout) === | === serReadLn(msTimeout) === | ||
- | reads from input until a LF (dez. 10 hex 0x0A) appears and returns that input as String | + | Liest von der Eingabe bis ein Zeilenvorschub |
=== serWait(OptionString, | === serWait(OptionString, | ||
- | In case you want to wait for some input strings, of which several could appear, you fill the // | + | Falls Du auf mehrere Zeichenfolgen wartest, von denen einige auftreten könnten, füllst Du den // |
- | ==== | + | ==== |
=== serDisplayWrite(String) === | === serDisplayWrite(String) === | ||
- | Writes | + | Schreibt eine // |
=== dbLookup(db-File , searchstring) === | === dbLookup(db-File , searchstring) === | ||
- | Searches | + | Sucht in der // |
- | dbLookup() | + | dbLookup() |
| | ||
myTable = dbLookup(" | myTable = dbLookup(" | ||
- | // | + | // |
- | * if // | + | * if // |
- | * if // | + | * if // |
- | * if // | + | * if // |
- | When something has been found, than // | + | Wenn etwas gefunden wurde, enthält |
- | The header | + | Der "header" Bereich wird benötigt, wenn Du nicht weißt |
col= myTable.header[" | col= myTable.header[" | ||
Line 196: | Line 185: | ||
2 | 2 | ||
- | // | + | // |
+ | Der //data// Daten Bereich enthält dann die gefundenen Daten, aufgebaut in einem zweidimensionalen Feld, sortiert nach Zeilen und Spalten. | ||
+ | result=myTable.data[row][column] | ||
- | The //data// section then contains the found data itself, arranged as a two dimensional array, sorted by rows and columns. | + | **Achtung**: Obwohl die Zeilen- und Spaltenindexe durch Zahlen dargestellt werden |
- | + | ||
- | result=myTable.data[row][column] | + | |
- | + | ||
- | **ATTENTION**: Although the row and column indexes are expressed as numbers | + | |
column=3 | column=3 | ||
Line 209: | Line 196: | ||
result=myTable.data[tostring(row)][tostring(column)]) | result=myTable.data[tostring(row)][tostring(column)]) | ||
| | ||
- | | + | |
- | Here after all a piece of sample code | + | Nach all den theoretischen Informationen ein kleines Stück Beispielkode: |
<code lua> | <code lua> | ||
Line 234: | Line 221: | ||
</ | </ | ||
- | ===== Some Programming Tricks | + | ===== Ein paar Programmiertricks |
- | Coming from old fashioned programming languages, you might be used to simple and static variable types like numbers and Strings. But Lua offers much more comfort here, especially with the support of nested | + | Wenn Du Kenntnisse aus den althergebrachten Programmiersprachen mitbringst, wirst Du wahrscheinlich einfache und statische Variablentypen verwenden, wie Zahlen und Zeichenfolgen. Aber Lua offeriert hier mehr Komfort, besonders mit der Hilfestellung von geschachtelten |
- | Let's assume a common scenario: You want to use a number of menu items, which basically do all the same (getting a value from a vehice) just with different parameters. | + | Wir wollen uns ein häufiges Szenario vorstellen: Du möchtest eine Anzahl von Menüeinträgen verwenden, welche alle das Gleiche tun, Einen Wert von einem Fahrzeug erhalten, nur mit verschiedenen Parametern. |
- | In former days you had to write one function for each single value and a long list of menu items, but in Lua, you can store all parameters, their meanings and even the function reference to get them in a single array like | + | In der Vergangenheit musstest Du eine Funktion für jeden einzelnen Wert und einen lange Liste von Menüeinträgen schreiben. Aber in Lua kannst Du alle Parameter, deren Bedeutungen und auch eine Funktionsreferenz, um Sie zu bekommen, in einem einzigen Feld speichern wie |
< | < | ||
Line 251: | Line 238: | ||
</ | </ | ||
- | then, during your menu initialisation, you can let Lua run though the array and building the menu out of it | + | Dann, während Deiner Menü Initialisierung, kannst Du Lua das Feld durcharbeiten und das Menü daraus aufbauen lassen. |
<code lua> | <code lua> | ||
Line 263: | Line 250: | ||
</ | </ | ||
- | And again: That' | + | Und wieder einmal kann man sagen: Das war's. |
+ | |||
+ | Wenn dann später eine Funktion aufgerufen wird, durch seinen Menü Eintrag, bekommt es einen Hash Key aus dem Menu2Data Feld als dessen id Parameter. Damit kann die Funktion, dann Ihre eigenen Parametersätze aus dem Menu2Data Feld auslesen um die korrekten Werte auszurechnen. | ||
- | When than later on a function is called by its menu item, it gets the hash key of the Menu2Data | + | Bitte beachte den Gebrauch des _G array Feldes in dem obigen Beispiel: Lua speichert alle Funktionen in sein globales _G array Feld, wo sie dann referenziert über Ihren Namen, als normale Funktion benutzt werden können. So macht der '' |
- | Please also note the use of the _G array in the sample above: Lua stores also all functions into its global _G array, where they can be refenced by their name and used as a normal function. So the '' | + | |
- | - it finds a function by its name | + | - dann ruft es diese Funktion auf, wie auch der Nutzer es tun würde |
- | - then it calls these function as if the user would do it | + | - es speichert den aktuellen Rückgabewert |
- | - it saves the actual return value (which represents e.g. the actual measuring data) in res | + | - res wird dann wie der initial |
- | - res is then be used as initial | + | |
- | By that it's possible without big efforts to fill a menu with real data already during initialization, so the actual data is visible straight from the beginning. | + | Durch diese Vorgehensweise ist es möglich, ohne großen Aufwand ein Menü mit den reellen Daten während der Initialisierung zu füllen. So sind die aktuellen Daten von Anfang an direkt sichtbar. |
de/doc/lua_start.txt · Last modified: 2014/11/23 21:26 by wsauer