pvbrowser, pvb® - The Process Visualiation Browser.

  • English
  • Deutsch

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
    

Steps

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 ...