comment rédiger/modifier export.lua pour exporter des données de BS vers un autre programme :
exemple 1 : SUR LE MEME PC avec TouchPal
((voir un fichier export.lua de l'utilitaire BSVP par exemple pour des protocoles de communications en reseau entre 2 PC) = autre sujet à faire... mais que je rédigerais plus tard car c'est en cours de dev et de mise au point... donc pour plus tard...) LINK
cette fonction est active dans la
version 0.4 de touchPal, je n'en suis pas l'auteur
je me contente donc de traduire commenter et expliquer le script lua
du fichier export.lua de BS, modifié pour TouchPal, livré avec TouchPal
en ne gardant que les lignes necessaires et qui ne concernent que la connexion
j'ai retiré le reste pour plus de simplicité
pour que l'export.lua fonctionne, ne pas oublier
dans ./Config/Export/Config.lua
EnableExportScript = true -- au lieu de false (valeur par defaut : false)
.
au début de export.lua on trouve ces lignes :
définitions des variables utilisées dans ce script
-- Simulation id
gSimID = os.time()
-- Connection status
gConnected = false
gLastAck = 0
gAckExpected = 0
gAckAttempts = 0
.
fonction exécutée une fois au démarrage de la mission :
définition des
paramètres de connection TCP UDP
et des
adresses de communication entre BS et ici TouchPAL pour notre exemple
pour TouchPAL 0.4:
ip = 127.0.0.1 = localhost pour une utilisation monoposte,
port = 9089 pour TouchPal
pour l'instant touchPAL ne fonctionne pas en reseau. (version 0.4)
function LuaExportStart()[INDENT] -- 1 )ouverture d'un fichier de export.log (historique) dans le dossier .\Temp de BS
-- c'est facultatif mais peut aider pour debugger un script
[/INDENT][INDENT]local file = io.open("./Temp/Export.log", "w")
if file then[INDENT] io.output(file)
io.write("---Log: Start-----", "\n")
io.flush()
[/INDENT]end
-- 2) definition de la connexion vers touchpal
package.path = package.path..";.\\LuaSocket\\?.lua"
package.cpath = package.cpath..";.\\LuaSocket\\?.dll"
socket = require("socket")
-- N'oubliez pas les "" ci dessous
host = "127.0.0.1"
port = 9089
c = socket.udp()
c:setpeername(host, port)
-- délai d'expiration pour lecture sur port
c:settimeout(.01)
-- ecrit dans le fichier log
io.write("---Log: Connection Request Sent-----", "\n")
-- envoi *C à touchPal pour y initer la connexion (cf config.xml de touchpal )
c:send("*C"..gSimID.."\n")
gAckExpected = 1
gConnected = false
[/INDENT]end
.
fonction exécutée une fois à la terminaison de la mission
ferme les connexions
ex du export.lua de TouchPAL :
function LuaExportStop()[INDENT] -- ferme le fichier log
io.write("---Log: End-----", "\n")
io.flush()
io.close()
-- ferme touchpal[INDENT]-- la ligne ci-dessous envoie les caractères *Q à TouchPal
-- le fichier xml de configuration de TouchPal définit cette séquence de caractère comme l'ordre de fermer l'application TouchPal
[/INDENT]socket.try(c:send("*Q\n"))
-- ferme la connexion
c:close()
[/INDENT]end
.
.
Exemple 1 bis : sur le meme PC ou en reseau avec BSVP
.
function LuaExportStart()
[INDENT] -- Exécuté une fois au démarrage de la mission
[/INDENT][INDENT]-- Initialisation des connexions
-- chemins d'accès aux bibliothèques du socket lua[/INDENT][INDENT] package.path = package.path..";.\\LuaSocket\\?.lua"
package.cpath = package.cpath..";.\\LuaSocket\\?.dll"
socket = require("socket")
[/INDENT][INDENT][INDENT] -- pour utilisation monoposte
[/INDENT][INDENT] host = host or "localhost"
[/INDENT][INDENT] -- pour utilisation en reseau : décommenter la ligne suivante et commenter la précédente
[/INDENT][INDENT] -- host = host or "192.168.0.101"
[/INDENT] -- pour BSVP : port 8080
port = port or 8080
-- connexion
c = socket.try(socket.connect(host, port))
-- transmission immédiate des données
[/INDENT][INDENT] c:setoption("tcp-nodelay",true)
[/INDENT] end
function LuaExportStop()
[INDENT]-- Exécutée à l'arrêt de la mission.
-- Fermeture des connexions
socket.try(c:send("quit"))
c:close()
[/INDENT] end
.
Exemple 2 : sur le meme PC : Touchpal + BSVP
profil posté par Gadroc
http://forums.eagle.ru/showpost.php?p=7 ... stcount=78
On crée d'abord 2 variables supplémentaires pour communiquer sur deux ports différents
-- TouchPal Host and Port
gTPHost = "127.0.0.1"
gTPPort = 9089
-- BSVP Blackshark Virtual Panel Host and Port
gBSVPHost = "127.0.0.1"
gBSVPPort = 8080
.
.
on modifie ensuite un peu les sections suivantes :
function LuaExportStart()[INDENT] -- Works once just before mission start.
-- Open log file for export
local file = io.open("./Temp/Export.log", "w")
if file then
io.output(file)
io.write("---Log: Start-----", "\n")
io.flush()
end
-- 2) Setup UDP socket to talk
package.path = package.path..";.\\LuaSocket\\?.lua"
package.cpath = package.cpath..";.\\LuaSocket\\?.dll"
socket = require("socket")[INDENT]-- 2-1) Setup udp sockets to talk to touchpal[INDENT]c = socket.udp()
c:setpeername(gTPHost, gTPPort)
-- set the timeout for reading the socket
c:settimeout(.01)
[/INDENT][/INDENT][INDENT]-- 2-2) Setup TCP socket to talk to BSVP[INDENT]-- connect to the listener socket
bsvpc = socket.try(socket.connect(gBSVPHost, gBSVPPort))
-- set immediate transmission mode
bsvpc:setoption("tcp-nodelay",true)
[/INDENT][/INDENT]SendConnectMessage()
[/INDENT]end
function LuaExportAfterNextFrame()[INDENT] ProcessOutput()
ProcessBSVP()
[/INDENT]end
function LuaExportStop()[INDENT] -- Works once just after mission stop.
io.write("---Log: End-----", "\n")
io.flush()
io.close()
-- to close the listener socket for TouchPAL
socket.try(c:send("*Q\n"))
c:close()
-- to close the listener socket for BSVP
socket.try(bsvpc:send("quit"))
bsvpc:close()
[/INDENT]end
.
POUR SIOC + BSVP + Touchpal : see Oakes site for the time :
http://code.google.com/p/dcsbsexport/downloads/list
http://code.google.com/p/dcsbsexport/updates/list
function LuaExportStart()
-- 2) Socket
package.path = package.path..";.\\LuaSocket\\?.lua"
package.cpath = package.cpath..";.\\LuaSocket\\?.dll"
socket = require("socket")
-- SIOC correct ip and port (127.0.0.1 = localhost, 8092 = default SIOC port)
-- la variable pitSIOC gère la connexion à SIOC :
pitSIOC = socket.try(socket.connect(127.0.0.1, 8092))
pitSIOC:setoption("tcp-nodelay",true)
pitSIOC:settimeout(.01)
-- Touchpal correct ip and port (127.0.0.1 = localhost, 9089 = default TP port)
-- la variable ecranTP gère la connexion à touchpal :
ecranTP = socket.udp()
ecranTP:setpeername(127.0.0.1, 9089)
ecranTP:settimeout(.01)
-- BSVP correct ip and port (127.0.0.1 = localhost, 8080= default BSVP port)
-- la variable ecranBSVP gère la connexion à BSVP :
ecranBSVP = socket.try(socket.connect(127.0.0.1, 8080))
ecranBSVP:setoption("tcp-nodelay",true)
-- Evidemment si vous utilisez des PC en réseau il faut changer les IP.