- aggiunta gestione LuaManager per plugin

This commit is contained in:
Emmanuele Sassi
2024-08-09 17:03:53 +02:00
parent fad64bb5b4
commit ffb77868db
5 changed files with 62 additions and 50 deletions
@@ -0,0 +1,8 @@
Public Interface IPluginLuaManager
Function PlgInit(state As Object) As Boolean
'Function PlgGetPrivateProfileDouble(lpAppName As String, lpKeyName As String, dDefault As Double, lpFileName As String) As Double
'Function PlgGetPrivateProfileString(lpAppName As String, lpKeyName As String, lpDefault As String, lpReturnedString As StringBuilder, nSize As Integer, lpFileName As String) As Integer
'Function PlgWritePrivateProfileString(lpAppName As String, lpKeyName As String, lpString As String, lpFileName As String) As Boolean
End Interface
@@ -83,6 +83,7 @@
<ItemGroup>
<Compile Include="IHost.vb" />
<Compile Include="IPluginControl.vb" />
<Compile Include="IPluginLuaManager.vb" />
<Compile Include="My Project\AssemblyInfo.vb">
<SubType>Code</SubType>
</Compile>
+45 -39
View File
@@ -2,62 +2,68 @@
Imports System.Diagnostics
Imports System.IO
Imports KeraLua
Imports Supervisor.Plugin.Interface
Public Module LuaManager
Private state As Lua
Private m_state As Lua
Friend ReadOnly Property state As Lua
Get
Return m_state
End Get
End Property
Friend Function SetGlobVar(sName As String, bValue As Boolean) As Boolean
Return Lua_Aux.LuaSetGlobVar(state, sName, bValue)
Return Lua_Aux.LuaSetGlobVar(m_state, sName, bValue)
End Function
Friend Function SetGlobVar(sName As String, nValue As Integer) As Boolean
Return Lua_Aux.LuaSetGlobVar(state, sName, nValue)
Return Lua_Aux.LuaSetGlobVar(m_state, sName, nValue)
End Function
Friend Function SetGlobVar(sName As String, dValue As Double) As Boolean
Return Lua_Aux.LuaSetGlobVar(state, sName, dValue)
Return Lua_Aux.LuaSetGlobVar(m_state, sName, dValue)
End Function
Friend Function SetGlobVar(sName As String, sValue As String) As Boolean
Return Lua_Aux.LuaSetGlobVar(state, sName, sValue)
Return Lua_Aux.LuaSetGlobVar(m_state, sName, sValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef bValue As Boolean) As Boolean
Return Lua_Aux.LuaGetGlobVar(state, sName, bValue)
Return Lua_Aux.LuaGetGlobVar(m_state, sName, bValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef nValue As Integer) As Boolean
Return Lua_Aux.LuaGetGlobVar(state, sName, nValue)
Return Lua_Aux.LuaGetGlobVar(m_state, sName, nValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef dValue As Double) As Boolean
Return Lua_Aux.LuaGetGlobVar(state, sName, dValue)
Return Lua_Aux.LuaGetGlobVar(m_state, sName, dValue)
End Function
Friend Function GetGlobVar(sName As String, ByRef sValue As String) As Boolean
Return Lua_Aux.LuaGetGlobVar(state, sName, sValue)
Return Lua_Aux.LuaGetGlobVar(m_state, sName, sValue)
End Function
Friend Function CreateGlobTable(sName As String) As Boolean
Return Lua_Aux.LuaCreateGlobTable(state, sName)
Return Lua_Aux.LuaCreateGlobTable(m_state, sName)
End Function
Public Function ExecFile(ByVal sPath As String) As Boolean
' verifico ambiente lua
If IsNothing(state) Then Return False
If IsNothing(m_state) Then Return False
' eseguo la linea
Dim result As LuaStatus = state.LoadFile(sPath)
Dim result As LuaStatus = m_state.LoadFile(sPath)
Dim sError As String = String.Empty
If result <> LuaStatus.OK Then
sError = state.ToString(1)
sError = m_state.ToString(1)
EgtOutLog("Fail loading file: " & sPath & "ERROR:" & sError)
End If
result = state.PCall(0, -1, 0)
result = m_state.PCall(0, -1, 0)
If result <> LuaStatus.OK Then
sError = state.ToString(1)
state.Pop(1)
sError = m_state.ToString(1)
m_state.Pop(1)
EgtOutLog("Fail calling file: " & sPath & " ERROR: " & If(String.IsNullOrWhiteSpace(sError), "Unknown", sError))
End If
Return result = LuaStatus.OK
@@ -68,19 +74,19 @@ Public Module LuaManager
' recupero la funzione
If Not sName.Contains("."c) Then
' e' direttamente la funzione
state.GetGlobal(sName)
m_state.GetGlobal(sName)
Else
' e' in una table
Dim sTableName As String = "", sFunctionName As String = ""
Dim sParams() As String = sName.Split("."c)
sTableName = sParams(0)
sFunctionName = sParams(1)
state.GetGlobal(sTableName)
If Not state.IsTable(-1) Then Return False
state.GetField(-1, sFunctionName)
m_state.GetGlobal(sTableName)
If Not m_state.IsTable(-1) Then Return False
m_state.GetField(-1, sFunctionName)
' porto la funzione uno slot sotto e diminuisco lo stack di uno (per essere come caso sopra)
state.Copy(-1, -2)
state.Pop(1)
m_state.Copy(-1, -2)
m_state.Pop(1)
End If
Dim nParamCount = 0
If Not IsNothing(Params) Then
@@ -90,25 +96,25 @@ Public Module LuaManager
For Each Param In Params
Select Case Param.GetType()
Case GetType(Boolean)
state.PushBoolean(CBool(Param))
m_state.PushBoolean(CBool(Param))
Case GetType(Integer)
state.PushInteger(CInt(Param))
m_state.PushInteger(CInt(Param))
Case GetType(Double)
state.PushNumber(CDbl(Param))
m_state.PushNumber(CDbl(Param))
Case GetType(String)
state.PushString(CStr(Param))
m_state.PushString(CStr(Param))
End Select
Next
End If
' eseguo la chiamata
Dim result As LuaStatus = state.PCall(nParamCount, -1, 0)
Dim result As LuaStatus = m_state.PCall(nParamCount, -1, 0)
' senza errori
If result = LuaStatus.OK Then
Return True
Else
' recupero il messaggio di errore
Dim sError As String = state.ToString(-1)
state.Pop(1)
Dim sError As String = m_state.ToString(-1)
m_state.Pop(1)
EgtOutLog("Fail calling function: " & sName & " ERROR: " & sError)
Return False
End If
@@ -116,19 +122,19 @@ Public Module LuaManager
Public Function Init() As Boolean
' se già aperto, lo fermo per riavviarlo
If Not IsNothing(state) Then
state.Close()
state = Nothing
If Not IsNothing(m_state) Then
m_state.Close()
m_state = Nothing
End If
' inizializzo Lua
state = New Lua()
If IsNothing(state) Then
m_state = New Lua()
If IsNothing(m_state) Then
EgtOutLog("Error in Lua interpreter starting (LuaManager.Init)")
Return False
End If
' carico le librerie standard
state.OpenLibs()
If Not LuaInstallGeneral(state) Then
m_state.OpenLibs()
If Not LuaInstallGeneral(m_state) Then
Return False
End If
Return True
@@ -136,10 +142,10 @@ Public Module LuaManager
Public Function Close() As Boolean
' verifico ambiente lua
If IsNothing(state) Then Return False
If IsNothing(m_state) Then Return False
' termino Lua
state.Close()
state = Nothing
m_state.Close()
m_state = Nothing
Return True
End Function
-11
View File
@@ -31,7 +31,6 @@ Public Module Lua_General
Friend func_EntGetNumberFromIni As LuaFunction = AddressOf Lua_EntGetNumberFromIni
Friend func_EntGetStringFromIni As LuaFunction = AddressOf Lua_EntGetStringFromIni
Friend func_EntWriteStringToIni As LuaFunction = AddressOf Lua_EntWriteStringToIni
Friend func_EntGetNextDoor As LuaFunction = AddressOf Lua_EntGetNextDoor
Friend func_RdsStringGet As LuaFunction = AddressOf Lua_RdsStringGet
Friend func_RdsStringSetAsync As LuaFunction = AddressOf Lua_RdsStringSetAsync
Friend func_RdsPublishAsync As LuaFunction = AddressOf Lua_RdsPublishAsync
@@ -168,15 +167,6 @@ Public Module Lua_General
Return 1
End Function
Private Function Lua_EntGetNextDoor(ByVal p As IntPtr) As Integer
Dim state = Lua.FromIntPtr(p)
LuaClearStack(state)
Dim bResult As Boolean = WritePrivateProfileString(sSec, sKey, sVal, sIniFile)
' restituisco il risultato
LuaSetParam(state, bResult)
Return 1
End Function
Private Function Lua_RdsStringGet(ByVal p As IntPtr) As Integer
Dim state = Lua.FromIntPtr(p)
If IsNothing(Map.refMainWindowVM.RedisManager) OrElse IsNothing(Map.refMainWindowVM.RedisManager.Subscriber) Then
@@ -399,7 +389,6 @@ Public Module Lua_General
state.Register("RdsPublishAsync", func_RdsPublishAsync)
state.Register("ComReadShortVar", func_ComReadShortVar)
state.Register("ComWriteShortVar", func_ComWriteShortVar)
state.Register("EntGetNextDoor", func_print)
Return True
End Function
+8
View File
@@ -69,7 +69,10 @@ Public Class MainWindowVM
Application.Current.Resources.MergedDictionaries.Add(PluginDictionary)
'' aggiungo MainMenu dal plugin
Dim PluginMainMenu As IPluginControl = GetControlByName(Of IPluginControl)("Supervisor.Plugin.FiveLakes", "MainMenu")
'' aggiungo MainMenu dal plugin
'ContentPanel = PluginMainMenu
Dim PluginLuaManager As IPluginLuaManager = Map.refMainWindowVM.GetLuaManager(Of IPluginLuaManager)("Supervisor.Plugin.FiveLakes")
PluginLuaManager.PlgInit(LuaManager.state)
' aggiungo Project dal plugin
Dim ProjectPlugin As IPluginControl = GetControlByName(Of IPluginControl)("Supervisor.Plugin.FiveLakes", "Project")
ContentPanel = ProjectPlugin
@@ -99,6 +102,11 @@ Public Class MainWindowVM
Return DictionaryControl
End Function
Friend Function GetLuaManager(Of T)(sPluginFileName As String) As IPluginLuaManager
Dim LuaManager As Object = m_Loader.LoadByTag(Of T)(GetPathByName(sPluginFileName), "LuaManager").FirstOrDefault()
Return LuaManager
End Function
#End Region ' Plugin
End Class