Anatomie eines pvserver in Lua Script-Sprache
Ein pvserver in Lua kann ohne Installation des Qt-SDK und eines C++ Compilers erstellt werden. Alles was Sie benötigen ist in unserem Installationspaket enthalten. Die Struktur eines Lua pvserver ist sehr ähnlich wie die der C/C++ Version. Unsere Bibliotheken verfügen über eine Sprachanbindung für Lua, die mit swig erzeugt wird. Insofern kann das Referenz-Handbuch für die pvslib und der rllib auch für Lua verwendet werden. Es gibt ein Hauptprogramm pvslua, das die Datei main.lua liest und das Lua Script ausführt. Innerhalb von main.lua gibt es eine function luaMain(ptr), wo die Bedienung eines pvbrowser Klienten startet. pvslua ist ein C/C++ Programm mit dem gleichen Aufbau wie ein pvserver in C/C++ aber innerhalb pvMain() beginnt pvslua die Verarbeitung von main.lua.
Sie starten einen pvserver in Lua mit dem folgenden Befehl:
pvslua main.lua
Mit einem pvserver in Lua ist es möglich, den Lua-Code zu ändern, während der pvserver ausgeführt wird. Ein neu verbundener pvbrowser Klient sieht sofort die geänderte Version in main.lua .
main.lua
Immer wenn ein Klient eine Verbindung von pvbrowser zu pvslua herstellt, wird eine neuer Thread gestartet, der zur Bedienung des Klienten main.lua interpretiert. Die Funktion showMask1() zeigt und mask1 behandelt.
------------------------------------------------------------------------------ -- pvserver in lua : pvslua -port=5050 -cd=/your/directory/with/your/lua/code ------------------------------------------------------------------------------ trace = 1 -- here you may put variables global for all your masks dofile("mask1.lua") -- include your masks here ------------------------------------------------------------------------------ function luaMain(ptr) -- pvserver Lua Main Program p = pv.getParam(ptr) -- get the PARAM structure pv.pvSetCaption(p,string.format("Hello Lua %d",123)) pv.pvResize(p,0,1280,1024) pv.pvGetInitialMask(p) print("Inital mask = ", p.initial_mask) ret = 1 while 1 do -- show your masks if (ret==1) then ret = showMask1(p) else ret = 1 end end pv.pvThreadFatal(p,"Lua calling ThreadFatal") return 0 end
Definition von mask1 in Lua
showMask1() wird durch pvdevelop generiert. Sie müssen es nicht manuell schreiben. Es zeigt mask1 an. Am Beginn von dieser Funktion werden die Namen der von Ihnen entworfenen Widgets aufgelistet. Auch die toolTip und whatsThis Eigenschaften der Widgets werden aufgelistet und der widgetType steht zur Verfügung.
Dann sehen Sie die Anrufe der pv-Funktionen, die den Widget Baum in dem pvbrowser Klient erzeugen.
Schließlich geht die Funktion in die Ereignisschleife. Dort werden die Ereignisse, die vom pvbrowser Klient gesendet werden, interpretiert und die entsprechenden slotFunktionen aufgerufen.
------------------------------------------------------------------------------ -- this file is generated by pvdevelop. DO NOT EDIT !!! ------------------------------------------------------------------------------ function showMask1(p) --- begin variables that are private to this mask -------------------------- iarray = pv.IntegerArray() -- see pv.getIntegers(text,iarray) below farray = pv.FloatArray() -- see pv.getFloats(text,farray) below --- begin construction of our mask ----------------------------------------- ID_MAIN_WIDGET = 0 PushButtonBack = 1 ID_END_OF_WIDGETS = 2 toolTip = {} toolTip[0] = "" toolTip[1] = "" whatsThis = {} whatsThis[0] = "" whatsThis[1] = "" widgetType = {} widgetType[0] = pv.TQWidget widgetType[1] = pv.TQPushButton pv.pvStartDefinition(p,ID_END_OF_WIDGETS) pv.pvQPushButton(p,PushButtonBack,0) pv.pvSetGeometry(p,PushButtonBack,10,10,111,40) pv.pvSetText(p,PushButtonBack,"Lua test") pv.pvEndDefinition(p); --- end construction of our mask ------------------------------------------- --- end variables that are private to this mask ---------------------------- dofile("mask1_slots.lua") -- include our slot functions if trace == 1 then print("show mask1") end pv.pvClearMessageQueue(p) -- clear all pending events ret = slotInit(p) -- intitialize our variables if ret ~= 0 then return ret end -- return number of next mask to call while(1) -- event loop do event = pv.pvGetEvent(p) -- get the next event result = pv.pvParseEventStruct(p,event) -- parse the event id = result.event i = result.i text = result.text -- now call the according slot function if id == pv.NULL_EVENT then ret = slotNullEvent(p) elseif id == pv.BUTTON_EVENT then if trace==1 then print("BUTTON_EVENT id=", i) end ret = slotButtonEvent(p,i) elseif id == pv.BUTTON_PRESSED_EVENT then if trace == 1 then print("BUTTON_PRESSED_EVENT id=",i) end ret=slotButtonPressedEvent(p,i) elseif id == pv.BUTTON_RELEASED_EVENT then if trace == 1 then print("BUTTON_RELEASED_EVENT id=",i) end ret=slotButtonReleasedEvent(p,i) elseif id == pv.TEXT_EVENT then --- snip ...
slotFunktionen in Lua
Die Aufgabe des Entwicklers einer Visualisierung ist es, die slotFunktionen zu schreiben. Der Rahmen wurde von pvdevelop generiert, als Sie die Maske angelegt haben.
------------------------------------------------------------------------------ -- mask1_slots.lua Please edit this file in order to define your logic ------------------------------------------------------------------------------ -- here you may define variables local for your mask -- also see the variables in the generated maskX.lua function slotInit(p) -- this function will be called before the event loop print("slotInit called") return 0 end function slotNullEvent(p) print("slotNullEvent called") return 0 end function slotButtonEvent(p,id) if (id == PushButtonBack) then pv.pvSetText(p,PushButtonBack,"I have been clicked") end return 0 end function slotButtonPressedEvent(p,id) return 0 end function slotButtonReleasedEvent(p,id) return 0 end --- snip ...