Während die Lua Skripte in OOBD Seite Dir Basiskenntnisse über die Funktionsweise von Lua innerhalb von OOBD vermittelt, will diese Anleitung Dir zeigen, wie Du Lua benutzen kannst, um Deine eigenen Ideen zu realisieren.
In dieser Anleitung werden wir die Vehikelidentifikationsnummer (VIN) aus einem Fahrzeug auslesen. Während wir das Vorhaben umsetzen, werden wir ein Menü erstellen, die Hardware identifizieren, die OOBD Lua Funktionsbibliothek nutzen, die Kommunikation mit dem Fahrzeug aufnehmen und das Ergebnis anzeigen.
Zunächst brauchen wir ein Menü, auf dem Gerät das wir benutzen, um in der Lage zu sein das hier alles zu starten. Wir machen dies mit der folgenden Kodesequenz
function Start(oldvalue,id) identifyOOBDInterface() openPage("VIN Test") addElement("VIN Number", "vin","-",0x2, "") pageDone() return oldvalue end ----------------- Stelle die Anfangsbedingungen ein -------------- Start("","") return
Nun, was passiert hier? Wenn der Lua Interpretierer sich durch das Skript arbeitet, findet er das
Start("","")
Kommando an dessen Ende. Dies ist eine der Namenskonventionen in OOBD: Die Funktion welches alles initialisiert, muss “Start” genannt werden.
Wenn wir nun in die Start Funktion schauen, finden wir
identifyOOBDInterface()
Das ist eine Funktion aus der serial_dxm.lua Support Bibliothek. In dieser findest Du nützliche Funktionen, die mehr oder weniger in allen OOBD Skripts verwendet werden. Wir werden diese in eine gemeinsame Datei speichern.
identifyOOBDInterface findet heraus, welcher CAN-Invader verbunden ist, um zukünftige Kommandos innerhalb der Bibliothek hardwareunabhängiger zu machen.
Die Kommandosequenz openPage(“VIN Test”), addElement(“VIN Number”, “vin”,“-”,0x2, “”) und pageDone() erstellt und zeigt ein einzigen Menüeintrag “VIN Nummer”. Das addElement() Kommando weist einer Lua Funktion vin diesen Menüeintrag zu:
function vin(oldvalue,id) echoWrite("0902\r") udsLen=receive() if udsLen>0 then if udsBuffer[1]==73 then local pos=4 local res="" while pos <= udsLen and pos < 36 do if udsBuffer[pos]>31 then res=res..string.char(udsBuffer[pos]) end pos= pos +1 end return res else return "Error" end else return "NO DATA" end end
Diese Funktion wird aufgerufen, wenn der Benutzer den Menüeintrag “VIN Number” auswählt. Innerhalb dieser Funktion, sendet zuerst
echoWrite("0902\r")
den Text “0902” als hexadezimales Zeichenfeld zum CAN-Invader, welches das OBD Standard Kommando ist um die Vehikelidentifikationsnummer (VIN) von einem Fahrzeug anzufordern. Der CAN-Invader selbst leitet diese Datensequenz als binäres Telegramm weiter auf den Diagnosebus (CAN) und wartet auf eine Antwort vom dem Steuergerät.
Das Kommando
udsLen=receive()
nimmt die Antwort des Moduls auf welche der CAN-Invader empfängt. Wenn udsLen größer als 0 ist, bedeutet das das etwas empfangen worden ist. Die empfangenen Bytes werden in dem Datenfeld udsBuffer[] abgespeichert.
Weil wir einen ASCII VIN Zeichensatz in den empfangenen Daten erwarten, arbeiten wir den Empfangspuffer udsBuffer[] durch und speichern alle gefundenen Bytes, als ASCII Werte in dem Datenfeld res. Dieses Datenfeld res wird dann mit
return res
zurückgegeben an die aufrufende Funktion.
Dies ist noch wichtig für Dich: Alle Lua Funktionen, welche von einem Menüeintrag aufgerufen werden, müssen ein Zeichenfeld zurückgeben, welches dann als aktueller Wert im Menü angezeigt wird. So repräsentiert dies, das Ergebnis des Aufrufs durch den Benutzer.
Und das ist schon die ganze Magie…. Basierend auf diesem Schema können alle Funktionalitäten in OOBD mit Lua realisiert werden